Есть ли стандартная библиотека Java, которая обрабатывает общие файловые операции, такие как перемещение/копирование файлов/папок?Перемещение/копирование операций с файлами в Java
ответ
Вот как сделать это с помощью java.nio
операций:
public static void copyFile(File sourceFile, File destFile) throws IOException {
if(!destFile.exists()) {
destFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
try {
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
// previous code: destination.transferFrom(source, 0, source.size());
// to avoid infinite loops, should be:
long count = 0;
long size = source.size();
while((count += destination.transferFrom(source, count, size-count))<size);
}
finally {
if(source != null) {
source.close();
}
if(destination != null) {
destination.close();
}
}
}
Пока нет, но New NIO (JSR 203) будет поддерживать эти общие операции.
В то же время есть несколько вещей, о которых следует помнить.
File.renameTo обычно работает только с тем же объемом файловой системы. Я считаю это эквивалентом команды «mv». Используйте его, если можете, но для общей копии и поддержки перемещения вам потребуется резервное копирование.
Когда переименование не работает, вам нужно будет фактически скопировать файл (удаление оригинала File.delete, если это операция «переместить»). Для достижения максимальной эффективности используйте методы FileChannel.transferTo или FileChannel.transferFrom. Реализация является специфичной для платформы, но в целом при копировании из одного файла в другой реализации реализация позволяет избежать переноса данных между ядром и пользовательским пространством, что дает большой импульс эффективности.
Отъезд: http://commons.apache.org/io/
Он имеет копию, и, как говорится в JDK уже двигаться.
Не используйте собственный метод копирования. Там так много плавая там ...
библиотека гуавы Google также имеет следующие:
http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html
Предыдущие ответы, кажется, быть устаревшим.
Java File.renameTo(), вероятно, является самым простым решением для API 7 и, кажется, работает нормально. Будьте осторожны, ЭТО НЕ ПРОХОДИТ ИСКЛЮЧЕНИЯ, но возвращает true/false !!!
Обратите внимание, что в предыдущих версиях проблемы были такими же (NIO).
Если вам нужно использовать предыдущую версию, отметьте here.
Here's an example for API7:
File f1= new File("C:\\Users\\.....\\foo");
File f2= new File("C:\\Users\\......\\foo.old");
System.err.println("Result of move:"+f1.renameTo(f2));
В качестве альтернативы:
System.err.println("Move:" +f1.toURI() +"--->>>>"+f2.toURI());
Path b1=Files.move(f1.toPath(), f2.toPath(), StandardCopyOption.ATOMIC_MOVE ,StandardCopyOption.REPLACE_EXISTING););
System.err.println("Move: RETURNS:"+b1);
Попробуйте использовать org.apache.commons.io.FileUtils (Общие манипуляции файла утилиты). Услуги предоставляются в следующих методов:
(1) FileUtils.moveDirectory(File srcDir, File destDir) => Перемещает каталог .
(2) FileUtils.moveDirectoryToDirectory(File src, File destDir, boolean createDestDir) => Перемещение каталога в другой каталог.
(3) FileUtils.moveFile(File srcFile, File destFile) => Перемещает файл.
(4) FileUtils.moveFileToDirectory(File srcFile, File destDir, boolean createDestDir) => Перемещает файл в каталог.
(5) FileUtils.moveToDirectory(File src, File destDir, boolean createDestDir) => Перемещение файла или каталога в пункт назначения .
Это просто, легко и быстро.
Интересное наблюдение: Пробовал копировать один и тот же файл через различные классы java и печатать время в наносекундах.
Продолжительность потока с помощью FileOutputStream байт: 4 965 078
Продолжительность используя BufferedOutputStream: 1 237 206
Продолжительность используя (символов текста Читатель: 2 858 875
Продолжительность используя BufferedReader (текст потока буферизацией символов : 1 998 005
Продолжительность использования (файлы NIO копия): 18 351 115
ш купив вариант Files Nio copy, потребовалось почти 18 раз дольше !!! Nio - самый медленный вариант для копирования файлов, а BufferedOutputStream выглядит как самый быстрый. Я использовал один и тот же простой текстовый файл для каждого класса.
Commons IO имеет ограничения по размеру файлов, которые он может копировать. Для решения общего назначения ожидается более надежная реализация. – erickson 2008-11-19 00:14:00
Реализация собственного метода копирования тривиальна и означает, что вы не будете зависеть от всей библиотеки. * Do * реализовать свой собственный – 2008-11-19 08:57:04
Метод копирования далек от тривиального. Вы можете легко сделать правильный, который не работает с Streams, и быстрый, но неправильный, используя NIO. Никогда не используйте свои собственные утилиты, если есть качественные библиотеки. – Pyrolistical 2008-11-21 17:59:13