Самый быстрый способ скопировать файлы в Java - PullRequest
19 голосов
/ 23 октября 2010

Какой самый быстрый способ скопировать большое количество файлов в Java.До сих пор я использовал файловые потоки и nio.В целом потоки, кажется, быстрее, чем nio.Какой опыт вы сделали до сих пор?

Ответы [ 5 ]

20 голосов
/ 24 октября 2010

http://www.baptiste -wicht.com / 2010/08 / file-copy-in-java-benchmark / может получить ваш ответ.

Для теста я провел тесты с использованием разных файлов.

  1. Маленький файл (5 КБ)
  2. Средний файл (50 КБ)
  3. Большой файл (5 МБ)
  4. Жирный файл (50 МБ)
  5. И огромный файл (1,3 ГБ) только двоичный

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

  1. На том же жестком диске. Это жесткий диск IDE объемом 250 ГБ с 8 МБ кэш-памяти. Он отформатирован в Ext4.
  2. Между двумя дисками. Я использовал первый диск и другой жесткий диск SATA объемом 250 ГБ с 16 МБ кэш-памяти. Он отформатирован в Ext4.
  3. Между двумя дисками. Я использовал первый диск и другой жесткий диск SATA объемом 1 ТБ с 32 МБ кэш-памяти. Он отформатирован с использованием NTFS.

Я использовал тестовый фреймворк, , описанный здесь , для тестирования всех методов. Тесты проводились на моем персональном компьютере (Ubuntu 10.04, 64 бита, Intel Core 2 Duo 3.16 ГГц, 6 Go DDR2, жесткие диски SATA). Используемая версия Java - 64-битная виртуальная машина Java 7 ...

9 голосов
/ 23 октября 2010

Я бы использовал:

import java.io.*;
import java.nio.channels.*;

public class FileUtils{
    public static void copyFile(File in, File out) 
        throws IOException 
    {
        FileChannel inChannel = new
            FileInputStream(in).getChannel();
        FileChannel outChannel = new
            FileOutputStream(out).getChannel();
        try {
            inChannel.transferTo(0, inChannel.size(),
                    outChannel);
        } 
        catch (IOException e) {
            throw e;
        }
        finally {
            if (inChannel != null) inChannel.close();
            if (outChannel != null) outChannel.close();
        }
    }

    public static void main(String args[]) throws IOException{
        FileUtils.copyFile(new File(args[0]),new File(args[1]));
  }
}

Если в Windows размер ваших файлов превышает 64 МБ, вам может понадобиться посмотреть на это: http://forums.sun.com/thread.jspa?threadID=439695&messageID=2917510

1 голос
/ 31 июля 2018

Это зависит от файлов (большие файлы), для меня это самый быстрый способ с буферизованным потоком

 public void copyFile(File inFileStr, File outFileStr) throws IOException {

    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inFileStr)); 
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outFileStr))) {

        byte[] buffer = new byte[1024 * 1024];
        int read = 0;
        while ((read = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, read);
        }

        bis.close();
        bos.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }

}
1 голос
/ 22 мая 2017

Вы можете использовать реализацию FileUtils библиотеки apache commons-io для копирования файла

FileUtils.copyFile(new File(sourcePath), new File(destPath));

Который использует FileChannel для операций ввода-вывода.

Или используйте java.nio.file.Files s copy() метод.

1 голос
/ 23 октября 2010

Сделайте, чтобы java раскошелился на пакетный скрипт ОС, который копирует файлы. Ваш код, возможно, должен написать пакетный скрипт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...