Операции перемещения / копирования файлов в Java - PullRequest
70 голосов
/ 19 ноября 2008

Существует ли стандартная библиотека Java, которая обрабатывает такие общие файловые операции, как перемещение / копирование файлов / папок?

Ответы [ 7 ]

72 голосов
/ 26 мая 2009

Вот как это сделать с помощью 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();
        }
    }
}
40 голосов
/ 19 ноября 2008

Пока нет, но Новый NIO (JSR 203) будет поддерживать эти общие операции.

Между тем есть несколько вещей, о которых следует помнить.

File.renameTo обычно работает только на том же томе файловой системы. Я считаю это эквивалентом команды "mv". Используйте его, если можете, но для общей поддержки копирования и перемещения вам понадобится запасной вариант.

Если переименование не работает, вам нужно будет фактически скопировать файл (удалив оригинал с помощью File.delete , если это операция «перемещение»). Чтобы сделать это с максимальной эффективностью, используйте методы FileChannel.transferTo или FileChannel.transferFrom . Реализация зависит от платформы, но, как правило, при копировании из одного файла в другой реализации избегают переноса данных назад и вперед между ядром и пространством пользователя, что приводит к значительному повышению эффективности.

17 голосов
/ 19 ноября 2008

Выезд: http://commons.apache.org/io/

У него есть копия, и, как указано, у JDK уже есть ход.

Не реализуйте свой собственный метод копирования. Там так много плавающих там ...

10 голосов
/ 06 июня 2012

Предыдущие ответы кажутся устаревшими.

Java File.renameTo () , вероятно, самое простое решение для API 7 и, похоже, работает нормально. Будьте осторожны, ЭТО НЕ ИСКЛЮЧАЕТ ИСКЛЮЧЕНИЙ, но возвращает true / false !!!

Обратите внимание, что в предыдущих версиях с ним, похоже, были проблемы (аналогично NIO ).

Если вам нужно использовать предыдущую версию, отметьте здесь .

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);
8 голосов
/ 05 июля 2010

В библиотеке Google Guava также есть следующие данные:

http://guava -libraries.googlecode.com / SVN / багажник / Javadoc / COM / Google / общие / И.О. / Files.html

7 голосов
/ 01 февраля 2013

Попробуйте использовать org.apache.commons.io.FileUtils (Общие утилиты для работы с файлами). Услуги предоставляются следующими способами:

(1) FileUtils.moveDirectory (Файл srcDir, Файл destDir) => Перемещает каталог.

(2) FileUtils.moveDirectoryToDirectory (файл src, файл destDir, логическое значение createDestDir) => Перемещает каталог в другой каталог.

(3) FileUtils.moveFile (Файл srcFile, Файл destFile) => Перемещение файла.

(4) FileUtils.moveFileToDirectory (файл srcFile, файл destDir, логическое значение createDestDir) => Перемещает файл в каталог.

(5) FileUtils.moveToDirectory (файл src, файл destDir, логическое значение createDestDir) => Перемещает файл или каталог к ​​месту назначения каталог.

Это просто, легко и быстро.

0 голосов
/ 09 января 2017

Интересное наблюдение: Пытался скопировать один и тот же файл через различные классы Java и печатать время в нано секундах.

Продолжительность с использованием потока байтов FileOutputStream: 4 965 078

Продолжительность с использованием BufferedOutputStream: 1 237 206

Продолжительность с использованием (символьный текст Reader: 2 858 875

Длительность с использованием BufferedReader (Поток буферизованного символа: 1 998 005

Продолжительность с использованием (файлы NIO copy): 18 351 115

при использовании опции копирования файлов Nio это заняло почти 18 раз больше времени !!! Nio - самый медленный вариант для копирования файлов, а BufferedOutputStream выглядит самым быстрым. Я использовал один и тот же простой текстовый файл для каждого класса.

...