2009-09-01 5 views
3

Что является лучшим вариантом (с точки зрения производительности): копирование файла с использованием fileinputstream и fileoutputstream или запуск команды копирования команд конкретной ОС на Java?Копирование файлов в Java

ответ

2

Я уверен, что использование команды копирования конкретной ОС будет быстрее или, по крайней мере, так же быстро, как простое самозаписываемое решение. Конкретная команда ОС, вероятно, использует разумный размер буфера и другие оптимизации, которые вам в противном случае пришлось бы выяснить сами.

Edit:
х-х правильно, вы не должны вызвать команду копирования непосредственно. Я думал, что у Java уже есть метод копирования, например File.copy() или что-то еще, но я ничего не мог найти, даже в JDIC. Таким образом, Apo Commons IO - это, вероятно, путь.

2

Используйте библиотеку excelent commons-io, она имеет method, которая будет делать именно это. Он очень широко используется и, конечно же, очень оптимизирован.

Загрузить его с here или скопировать POM dependency в файл pom.xml при использовании maven.

Не копируйте с конкретной копией ОС, она не будет переносимой. Использование не-java-кода из java, будь то с JNI или нерестом внешней команды, является головной болью и кошмаром для обслуживания.

+0

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

+0

, даже если производительность является важным критерием, узким местом будет диск, а не процессор, поэтому не важно, на каком языке вы это делаете. – flybywire

+0

Библиотека, чтобы сделать копию файла !!! Это немного за борт для примерно 5 строк кода, не так ли? Или он использует некоторые тайные одновременные вызовы чтения/записи Java для максимальной пропускной способности? –

2

Сделайте это на Java.

Одна из проблем с запуском команды ОС заключается в том, что вам необходимо создать полный процесс на уровне ядра ОС, и это тяжелая операция. Есть большие фиксированные накладные расходы, которые будут особенно серьезными для небольших файлов.

Другая проблема заключается в том, что она добавляет системную зависимость без уважительной причины.

1

Зависит от того, что вы будете делать в случае возникновения ошибок. Часто собственная команда лучше способна обрабатывать ситуации с ошибками, но вам может быть трудно заставить ее взаимодействовать с пользователем.

Чистое Java-решение (помимо кросс-платформы) позволяет вам полностью контролировать - я бы предложил использовать библиотеку для обработки беспорядочных деталей и ситуаций с ошибками.

Смежные вопросы