Существует ли стандартная библиотека Java, которая обрабатывает общие операции с файлами, такие как перемещение/копирование файлов/папок?
Перемещение/копирование операций с файлами в Java
Ответ 1
Здесь, как это сделать с помощью операций 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();
}
}
}
Ответ 2
Пока нет, но Новый NIO (JSR 203) будет поддерживать эти общие операции.
Тем временем, нужно помнить несколько вещей.
File.renameTo обычно работает только с тем же объемом файловой системы. Я считаю это эквивалентом команды "mv". Используйте его, если можете, но для общей копии и поддержки перемещения вам потребуется резервное копирование.
Если переименование не работает, вам нужно будет фактически скопировать файл (удалив оригинал с помощью File.delete, если он "перемещается" "операция" ). Чтобы сделать это с максимальной эффективностью, используйте FileChannel.transferTo или FileChannel. Передача из методов. Реализация является специфичной для платформы, но в целом при копировании из одного файла в другой реализации реализация позволяет избежать переноса данных между ядром и пользовательским пространством, что значительно повышает эффективность.
Ответ 3
Отъезд: http://commons.apache.org/io/
У него есть копия, и, как указано, JDK уже имеет перемещение.
Не используйте собственный метод копирования. Там так много плавающих...
Ответ 4
Предыдущие ответы кажутся устаревшими.
Java File.renameTo(), вероятно, самое простое решение для API 7 и, похоже, работает нормально. Будьте осторожны, ЭТО НЕ ИСКЛЮЧАЕТ ИСКЛЮЧЕНИЙ, но возвращает true/false !!!
Обратите внимание, что в предыдущих версиях возникали проблемы с ним (так же, как NIO).
Если вам нужно использовать предыдущую версию, проверьте здесь.
Вот пример для 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);
Ответ 5
В библиотеке Google Guava также есть:
http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html
Ответ 6
Попробуйте использовать org.apache.commons.io.FileUtils (общие утилиты для управления файлами). Услуги предоставляются следующими способами:
(1) FileUtils.moveDirectory(Файл srcDir, File destDir) = > Перемещает каталог.
(2) FileUtils.moveDirectoryToDirectory(Файл src, File destDir, boolean createDestDir) = > Перемещает каталог в другой каталог.
(3) FileUtils.moveFile(Файл srcFile, File destFile) = > Перемещает файл.
(4) FileUtils.moveFileToDirectory(Файл srcFile, File destDir, boolean createDestDir) = > Перемещает файл в каталог.
(5) FileUtils.moveToDirectory(Файл src, File destDir, boolean createDestDir) = > Перемещает файл или каталог в пункт назначения каталог.
Это просто, легко и быстро.
Ответ 7
Интересное наблюдение: Пробовал копировать один и тот же файл с помощью различных классов java и печатного времени в наносекундах.
Продолжительность с использованием байтового потока FileOutputStream: 4 965 078
Продолжительность с использованием BufferedOutputStream: 1 237 206
Продолжительность с использованием (текстовый текст Reader: 2 858 875
Продолжительность с использованием BufferedReader (Буферизованный текстовый поток символа: 1 998 005
Продолжительность использования (копия файлов NIO): 18 351 115
при использовании опции копирования файлов Nio потребовалось почти 18 раз дольше!!! Nio - это самый медленный вариант для копирования файлов, и BufferedOutputStream выглядит как самый быстрый. Я использовал один и тот же простой текстовый файл для каждого класса.