Java NIO и доступ к диску Windows - PullRequest
       25

Java NIO и доступ к диску Windows

7 голосов
/ 14 октября 2011

Нужны ли Java NIO специальные разрешения в Windows?

Когда я запускаю следующий код Java на Windows Server 2003, он завершается с ошибкой «отказано в доступе» (это все сообщение в окне терминала cygwin):

new FileOutputStream(outputFile).getChannel()
  .transferFrom(new FileInputStream(inputFile).getChannel(), 0, Long.MAX_VALUE);

но если я использую Apache commons-io (который, как я полагаю, НЕ использует NIO, он работает с теми же файлами ввода и вывода:

final FileInputStream inputStream = new FileInputStream(inputFile)
final FileOutputStream outputStream = new FileOutputStream(outputStream)
IOUtils.copy(inputStream, outputStream);

Я работаю на Java 5 с учетной записью администратора. Есть ли какое-то специальное разрешение для файла, которое должно быть установлено?

Ответы [ 2 ]

4 голосов
/ 27 ноября 2011

Причины в коде:

new FileOutputStream(outputFile).getChannel() .transferFrom(new FileInputStream(inputFile).getChannel(), 0, Long.MAX_VALUE);

Код неверен на нескольких уровнях.

  • нет закрытия потоков, исключение означает, что, скорее всего, файл недоступен для записи. При условии, что пользователь может получить доступ к типу исключения типа «отказано в доступе» к утечкам ресурсов (т.е. не закрывает), что препятствует завершению любой другой операции.

  • Вы не можете передавать без этой петли. Хотя он будет работать в Windows, TransferTo / From не читает и не записывает все сразу. Считайте, что он такой же, как inputStream.read () -> outputStream.write (), он аналогичен, за исключением того, что он может использовать DMA, отображаемый ОС.

  • TransferTo / From бесполезен в Windows, так как ОС не поддерживает его, поэтому причина в том, что он действительно работает: он эмулируется. В Linux / Solaris / MacOS он может просто передавать X байтов и делать это.

0 голосов
/ 27 ноября 2011

В каком контексте вы исполняете? Существуют ли параллельные потоки, использующие один и тот же файл?

Если это ваш случай, FileChannel блокирует весь или часть используемого файла. Метод блокировки (частичный файл или весь файл) зависит от платформы, и вполне возможно, что Windows 2003 является устаревшей платформой для этой техники.

Решение: смените ОС или используйте apache commons IO.

Примечание. Если вы заблокировали файл в одном запросе и не разблокировали его, необходимо перезапустить jvm.

...