Как мне ждать завершения операций с использованием Java 7 Files API? - PullRequest
0 голосов
/ 17 февраля 2019

Я пишу некоторый код Java, который создает каталог, а затем помещает некоторые файлы в этот каталог.Меня не волнует порядок, в котором создаются файлы, однако для успешного создания файлов необходимо сначала выйти из каталога.

Я хочу использовать (newish) java.nio.Files api, поскольку он имеет довольно элегантный набор методов для работы с файлами и каталогами.

Хотя приятно, что класс Files неблокирующий, это означает, что каталог невсегда существовать.Есть ли «правильный» способ определить, когда Files.createDirectories(path) завершен?

Не особенно сложный (вот почему мне нравится API для файлов), но вот пример кода:

Files.createDirectories(path);
Files.write(filename1, "some content".getBytes());
Files.write(filename2, "some other content".getBytes());

В приведенном выше примере path может быть /tmp/blah и filename1 = /tmp/blah/foo и filename2 = /tmp/blah/bar.

Очевидно, что я могу сделать это с помощью другого класса или библиотеки (например, Commons IO).) но сборка в java.nio.Files довольно хороша.

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Я понял это.На самом деле проблема заключалась не в неблокирующем характере класса Files.Я смешивал объекты File и Path, и преобразование между ними и java, похоже, запуталось в том, что такое каталог и файл, и вместо этого создал файлы, которые назывались blah/foo и blah/bar вместо файла, вызывающего foo впапка называется blah.Я просто переключился на передачу объектов Path вместо объектов File для представления моих файлов и каталогов, и все работает.

0 голосов
/ 17 февраля 2019

Существует ли "правильный" способ определить, когда был завершен файл Files.createDirectories (путь)

Как только он вернется, он будет завершен.Весьма вероятно, что это простая оболочка mkdir(2)

. Более того, неблокирующая семантика не влияет на обычные файлы (по крайней мере в Linux и по крайней мере сейчас) http://man7.org/linux/man-pages/man2/open.2.html

O_NONBLOCK или O_NDELAY

[...]

Обратите внимание, что этот флаг не действует для обычных файлов и блочных устройств;то есть операции ввода / вывода будут (кратко) блокироваться, когда требуется активность устройства, независимо от того, установлен ли O_NONBLOCK.

0 голосов
/ 17 февраля 2019

Я думаю, что вы не поняли.Эти операции на самом деле синхронны, так что вам сюда.Files.write использует java.io.OutputStream, например.

Некоторое имя адресовано возможной реализации createDirectory для Linux.
В Windows createDirectory использует CreateDirectory Функция WinAPI.

WindowsNativeDispatcher.CreateDirectory(var3.getPathForWin32Calls(), var4.address() /* Security descriptor */);

Buffers, Channels и Selectors являются неблокирующими .

...