Перемещение/копирование операций с файлами в 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);

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