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

StackOverflow https://stackoverflow.com/questions/300559

  •  08-07-2019
  •  | 
  •  

Вопрос

Существует ли стандартная библиотека 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();
        }
    }
}

Другие советы

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

А пока нужно помнить несколько вещей.

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

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

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

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

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

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

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 Guava также есть следующие:

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

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

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

(2) FileUtils.moveDirectoryToDirectory(File src, File destDir, boolean createDestDir) => Перемещает каталог в другой каталог.

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

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

(5) Fileutils.movetodirectory (file src, file destdir, boolean createStdir) => Перемещает файл или каталог в место назначения каталог.

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

Интересное наблюдение: Пытался скопировать один и тот же файл через различные классы 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 выглядит самым быстрым. Я использовал один и тот же простой текстовый файл для каждого класса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top