Код: Выделить всё
import java.io.*;
import java.nio.file.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
Path path = Files.createTempFile(null, null);
byte[] array = "test".getBytes();
Files.write(path, array);
System.err.println("1 File.length = " + path.toFile().length());
System.err.println("1 Files.size = " + Files.size(path));
try (InputStream in = Files.newInputStream(path, StandardOpenOption.DELETE_ON_CLOSE)) {
System.err.println("2 File.length = " + path.toFile().length());
System.err.println("2 Files.size = " + Files.size(path));
byte[] buf = new byte[array.length];
in.read(buf, 0, array.length);
if (Arrays.equals(array, buf)) {
System.err.println("Read OK");
}
} finally {
if (Files.deleteIfExists(path)) {
System.err.println("Deleted");
}
}
}
}
Код: Выделить всё
1 File.length = 4
1 Files.size = 4
2 File.length = 4
2 Files.size = 4
Read OK
Код: Выделить всё
1 File.length = 4
1 Files.size = 4
2 File.length = 0
Exception in thread "main" java.nio.file.NoSuchFileException: /tmp/1848835007433869473.tmp
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileAttributeViews$Basic.readAttributes(UnixFileAttributeViews.java:55)
at sun.nio.fs.UnixFileSystemProvider.readAttributes(UnixFileSystemProvider.java:144)
at sun.nio.fs.LinuxFileSystemProvider.readAttributes(LinuxFileSystemProvider.java:99)
at java.nio.file.Files.readAttributes(Files.java:1737)
at java.nio.file.Files.size(Files.java:2332)
at Main.main(Main.java:15)
Без StandardOpenOption.DELETE_ON_CLOSE программа работает последовательно на двух платформах, производящих выходные данные Windows.
Javadoc для DELETE_ON_CLOSE начинается со следующего:
Когда эта опция присутствует, тогда реализация делает изо всех сил попытку удалить файл при закрытии соответствующим методом close.
но, как видите, метод close вообще не был вызван.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -platforms
Мобильная версия