Операции перемещения / копирования файлов в Java



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

766   7  

7 ответов:

вот как это сделать с 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();
        }
    }
}

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

в то же время, есть несколько вещей, чтобы держать в уме.

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

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

проверить: http://commons.apache.org/io/

у него есть копия, и, как указано, JDK уже имеет move.

не реализовать свой собственный метод копирования. Там столько всего плавает...

предыдущие ответы, кажется, устарели.

Java .renameTo() это, вероятно, самое простое решение для API 7, и, кажется, работает нормально. Будьте осторожны, он не бросает исключения, но возвращает true/false!!!

обратите внимание, что есть проблемы с этим и в предыдущих версиях (так же, как НИО).

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

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);

библиотека гуавы Google также имеет следующее:

http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html

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

(1) FileUtils.moveDirectory(файл каталог исходного кода destdir, в файл) = > перемещает a справочник.

(2) FileUtils.moveDirectoryToDirectory(файл src, файл destDir, boolean createDestDir) => перенос каталога в другой каталог.

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

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

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

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

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

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

длительность использования BufferedOutputStream: 1 237 206

продолжительность использования (читатель текста символа: 2 858 875

Длительность с помощью BufferedReader(Буферизованный текстовый поток символов: 1 998 005

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

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

Comments

    Ничего не найдено.