Копирование файлов из одного каталога в другой в Java - PullRequest
140 голосов
/ 18 июля 2009

Я хочу скопировать файлы из одного каталога в другой (подкаталог), используя Java. У меня есть каталог, каталог, с текстовыми файлами. Я перебираю первые 20 файлов в dir и хочу скопировать их в другой каталог в каталоге dir, который я создал прямо перед итерацией. В коде я хочу скопировать review (который представляет i-й текстовый файл или обзор) в trainingDir. Как я могу это сделать? Кажется, такой функции не существует (или я не смог ее найти). Спасибо.

boolean success = false;
File[] reviews = dir.listFiles();
String trainingDir = dir.getAbsolutePath() + "/trainingData";
File trDir = new File(trainingDir);
success = trDir.mkdir();
for(int i = 1; i <= 20; i++) {
    File review = reviews[i];

}

Ответы [ 31 ]

152 голосов
/ 18 июля 2009

На данный момент это должно решить вашу проблему

File source = new File("H:\\work-temp\\file");
File dest = new File("H:\\work-temp\\file2");
try {
    FileUtils.copyDirectory(source, dest);
} catch (IOException e) {
    e.printStackTrace();
}

FileUtils класс из библиотеки apache commons-io , начиная с версии 1.2.

Лучше использовать сторонние инструменты вместо написания всех утилит самостоятельно. Это может сэкономить время и другие ценные ресурсы.

38 голосов
/ 18 июля 2009

В Стандартном API нет метода копирования файлов (пока). Ваши варианты:

  • Напишите его самостоятельно, используя FileInputStream, FileOutputStream и буфер для копирования байтов из одного в другой - или еще лучше, используйте FileChannel.transferTo ()
  • Пользователь Apache Commons ' FileUtils
  • Ожидание NIO2 в Java 7
30 голосов
/ 20 мая 2013

В Java 7 - это стандартный метод копирования файлов в java:

Files.copy.

Интегрируется с собственным вводом / выводом O / S для обеспечения высокой производительности.

См. Мой A на Стандартный краткий способ скопировать файл на Java? для полного описания использования.

26 голосов
/ 18 июля 2009

Пример ниже от Java Tips довольно прост. С тех пор я переключился на Groovy для операций, связанных с файловой системой - намного проще и элегантнее. Но вот советы Java, которые я использовал в прошлом. В нем отсутствует надежная обработка исключений, необходимая для обеспечения надежности.

 public void copyDirectory(File sourceLocation , File targetLocation)
    throws IOException {

        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists()) {
                targetLocation.mkdir();
            }

            String[] children = sourceLocation.list();
            for (int i=0; i<children.length; i++) {
                copyDirectory(new File(sourceLocation, children[i]),
                        new File(targetLocation, children[i]));
            }
        } else {

            InputStream in = new FileInputStream(sourceLocation);
            OutputStream out = new FileOutputStream(targetLocation);

            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
        }
    }
19 голосов
/ 18 июля 2009

Если вы хотите скопировать файл, а не переместить его, вы можете написать код следующим образом.

private static void copyFile(File sourceFile, File destFile)
        throws IOException {
    if (!sourceFile.exists()) {
        return;
    }
    if (!destFile.exists()) {
        destFile.createNewFile();
    }
    FileChannel source = null;
    FileChannel destination = null;
    source = new FileInputStream(sourceFile).getChannel();
    destination = new FileOutputStream(destFile).getChannel();
    if (destination != null && source != null) {
        destination.transferFrom(source, 0, source.size());
    }
    if (source != null) {
        source.close();
    }
    if (destination != null) {
        destination.close();
    }

}
14 голосов
/ 09 ноября 2011

apache commons Fileutils удобно. Вы можете сделать ниже деятельности.

  1. копирование файла из одного каталога в другой каталог.

    использование copyFileToDirectory(File srcFile, File destDir)

  2. копирование каталога из одного каталога в другой каталог.

    использование copyDirectory(File srcDir, File destDir)

  3. копирование содержимого одного файла в другой

    использование static void copyFile(File srcFile, File destFile)

11 голосов
/ 19 июля 2017

Spring Framework имеет много похожих классов утилит, таких как Apache Commons Lang. Так что есть org.springframework.util.FileSystemUtils

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);
9 голосов
/ 11 апреля 2014
File sourceFile = new File("C:\\Users\\Demo\\Downloads\\employee\\"+img);
File destinationFile = new File("\\images\\" + sourceFile.getName());

FileInputStream fileInputStream = new FileInputStream(sourceFile);
FileOutputStream fileOutputStream = new FileOutputStream(
                destinationFile);

int bufferSize;
byte[] bufffer = new byte[512];
while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
    fileOutputStream.write(bufffer, 0, bufferSize);
}
fileInputStream.close();
fileOutputStream.close();
7 голосов
/ 11 июня 2015
import static java.nio.file.StandardCopyOption.*;
...
Files.copy(source, target, REPLACE_EXISTING);

Источник: https://docs.oracle.com/javase/tutorial/essential/io/copy.html

7 голосов
/ 18 июля 2009

Вы, похоже, ищете простое решение (хорошая вещь). Я рекомендую использовать Apache Common FileUtils.copyDirectory :

Копирует весь каталог в новый место сохранения файла даты.

Этот метод копирует указанный каталог и все его дочерние каталоги и файлы в указанный место назначения. Пункт назначения новое местоположение и название каталог.

Каталог назначения создан если его не существует Если каталог назначения существовал, тогда этот метод объединяет источник с пункт назначения, с источником старшинство.

Ваш код может выглядеть просто и красиво:

File trgDir = new File("/tmp/myTarget/");
File srcDir = new File("/tmp/mySource/");

FileUtils.copyDirectory(srcDir, trgDir);
...