Вопрос по file, copy, directory, java – Копирование файлов из одного каталога в другой в Java

135

Я хочу скопировать файлы из одного каталога в другой (подкаталог), используя 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];

}
Да, точно. Я заинтересован в том, чтобы просто скопировать или переместить эти файлы в другой каталог (хотя в посте, который я попросил только для копирования). user42155
Итак, у вас есть каталог, полный файлов, и вы хотите скопировать только эти файлы? Нет рекурсии на входной стороне - например, скопировать все из подкаталогов в основной каталог? akarnokd
Обновление из будущего. Java 7 имеет функцию отFiles класс для копирования файлов. Вот еще один пост об этомstackoverflow.com/questions/16433915/… KevinL

Ваш Ответ

30   ответов
38

Write it yourself, using a FileInputStream, a FileOutputStream and a buffer to copy bytes from one to the other - or better yet, use FileChannel.transferTo() User Apache Commons' FileUtils Wait for NIO2 in Java 7
ОК, как это сделать в Java 7? Ссылка NIO2 теперь не работает.
+1 для NIO2: я экспериментирую с NIO2 / Java7 в эти дни ... и новый путь очень хорошо спроектирован
Я думаю, что для ссылки Apache Commons вы имели в виду ссылку на "#copyDirectory (java.io.File, java.io.File)" & quot;
@ ripper234: ссылка исправлена. Обратите внимание, что я нашел новую ссылку, введя & quot; java nio2 & quot; в Google ...
0

renameTo( ) Метод меняет имя файла:

public boolean renameTo( File destination)

Например, чтобы изменить имя файлаsrc.txt в текущем рабочем каталогеdst.txt, вы бы написали:

File src = new File(" src.txt"); File dst = new File(" dst.txt"); src.renameTo( dst); 

Вот и все.

Reference:

Гарольд, Эллиот Расти (2006-05-16). Java I / O (стр. 393). O 'Reilly Media. Kindle Edition.

Пожалуйста, дайте ответ, связанный с вопросом
Как указано в комментариях к вопросу, перемещение будет работать для ОП.
Это переместит файл. Неправильный ответ !
Перемещение не копирование.
Проголосовал, потому что это соответствует моей собственной проблеме И является самым простым ответом для перемещения файлов. Спасибо приятель
0

если она кому-нибудь поможет. Он скопирует все файлы из sourcedirectory в destinationDirectory.

пример:

rfunction("D:/MyDirectory", "D:/MyDirectoryNew", "D:/MyDirectory");

public static void rfunction(String sourcePath, String destinationPath, String currentPath) {
    File file = new File(currentPath);
    FileInputStream fi = null;
    FileOutputStream fo = null;

    if (file.isDirectory()) {
        String[] fileFolderNamesArray = file.list();
        File folderDes = new File(destinationPath);
        if (!folderDes.exists()) {
            folderDes.mkdirs();
        }

        for (String fileFolderName : fileFolderNamesArray) {
            rfunction(sourcePath, destinationPath + "/" + fileFolderName, currentPath + "/" + fileFolderName);
        }
    } else {
        try {
            File destinationFile = new File(destinationPath);

            fi = new FileInputStream(file);
            fo = new FileOutputStream(destinationPath);
            byte[] buffer = new byte[1024];
            int ind = 0;
            while ((ind = fi.read(buffer))>0) {
                fo.write(buffer, 0, ind);
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            if (null != fi) {
                try {
                    fi.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (null != fo) {
                try {
                    fo.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}
7

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

Copies a whole directory to a new location preserving the file dates.

This method copies the specified directory and all its child directories and files to the specified destination. The destination is the new location and name of the directory.

The destination directory is created if it does not exist. If the destination directory did exist, then this method merges the source with the destination, with the source taking precedence.

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

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

FileUtils.copyDirectory(srcDir, trgDir);
Это гораздо лучший метод, чем чтение и запись файлов. +1
Привет, я не хочу копировать каталог - только файлы в нем. user42155
Это в основном одно и то же, нет? Все файлы из исходного каталога окажутся в целевом каталоге.
30

is стандартный метод для копирования файлов в Java:

Files.copy.

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

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

Это не решает вопрос о копировании целых каталогов.
Да, это так ... если вы перейдете по ссылке. Не забывайте, что «Файл» в Java может представлять собой каталог или файл, это просто ссылка.
4

эта тема, Применимо только для Java 8.

Следующее может быть использовано для рекурсивного копирования всего из одной папки в другую:

public static void main(String[] args) throws IOException {
    Path source = Paths.get("/path/to/source/dir");
    Path destination = Paths.get("/path/to/dest/dir");

    List<Path> sources = Files.walk(source).collect(toList());
    List<Path> destinations = sources.stream()
            .map(source::relativize)
            .map(destination::resolve)
            .collect(toList());

    for (int i = 0; i < sources.size(); i++) {
        Files.copy(sources.get(i), destinations.get(i));
    }
}

Поток в стиле FTW.

Потрясающие!! используйте параллельный поток, если кто-то хочет скопировать каталог с миллионным файлом. Я могу легко показать процесс копирования файлов, но в команде JAVA 7 nio copyDirectory для большого каталога я не смог показать прогресс для пользователей.
3

скопировав исходный файл в новый файл и удалив оригинал.

public class MoveFileExample {

 public static void main(String[] args) {   

    InputStream inStream = null;
    OutputStream outStream = null;

    try {

        File afile = new File("C:\\folderA\\Afile.txt");
        File bfile = new File("C:\\folderB\\Afile.txt");

        inStream = new FileInputStream(afile);
        outStream = new FileOutputStream(bfile);

        byte[] buffer = new byte[1024];

        int length;
        //copy the file content in bytes 
        while ((length = inStream.read(buffer)) > 0) {
            outStream.write(buffer, 0, length);
        }

        inStream.close();
        outStream.close();

        //delete the original file
        afile.delete();

        System.out.println("File is copied successful!");

    } catch(IOException e) {
        e.printStackTrace();
    }
 }
}
147

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.

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

FileUtils не работает для меня. источник, взятый как "E: \\ Users \\ users.usr" и назначение как & quot; D: \\ users.usr & quot ;. В чем может быть проблема?
Эта работа для Java 1.7+
2
File dir = new File("D:\\mital\\filestore");
File[] files = dir.listFiles(new File_Filter("*"+ strLine + "*.txt"));
for (File file : files){    
    System.out.println(file.getName());

    try {
        String sourceFile=dir+"\\"+file.getName();
        String destinationFile="D:\\mital\\storefile\\"+file.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();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Пожалуйста, исправьте форматирование.
0

каталога в другой

// parent folders of dest must exist before calling this function
public static void copyTo( File src, File dest ) throws IOException {
     // recursively copy all the files of src folder if src is a directory
     if( src.isDirectory() ) {
         // creating parent folders where source files is to be copied
         dest.mkdirs();
         for( File sourceChild : src.listFiles() ) {
             File destChild = new File( dest, sourceChild.getName() );
             copyTo( sourceChild, destChild );
         }
     } 
     // copy the source file
     else {
         InputStream in = new FileInputStream( src );
         OutputStream out = new FileOutputStream( dest );
         writeThrough( in, out );
         in.close();
         out.close();
     }
 }
0

ь классы java.io вместо классов java.nio, вы можете использовать этот краткий метод для копирования папки и всего ее содержимого:

/**
 * Copies a folder and all its content to another folder. Do not include file separator at the end path of the folder destination.
 * @param folderToCopy The folder and it's content that will be copied
 * @param folderDestination The folder destination
 */
public static void copyFolder(File folderToCopy, File folderDestination) {
    if(!folderDestination.isDirectory() || !folderToCopy.isDirectory())
        throw new IllegalArgumentException("The folderToCopy and folderDestination must be directories");

    folderDestination.mkdirs();

    for(File fileToCopy : folderToCopy.listFiles()) {
        File copiedFile = new File(folderDestination + File.separator + fileToCopy.getName());

        try (FileInputStream fis = new FileInputStream(fileToCopy);
             FileOutputStream fos = new FileOutputStream(copiedFile)) {

            int read;
            byte[] buffer = new byte[512];

            while ((read = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, read);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
0
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyFiles {
    private File targetFolder;
    private int noOfFiles;
    public void copyDirectory(File sourceLocation, String destLocation)
            throws IOException {
        targetFolder = new File(destLocation);
        if (sourceLocation.isDirectory()) {
            if (!targetFolder.exists()) {
                targetFolder.mkdir();
            }

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

            }
        } else {

            InputStream in = new FileInputStream(sourceLocation);
            OutputStream out = new FileOutputStream(targetFolder + "\\"+ sourceLocation.getName(), true);
            System.out.println("Destination Path ::"+targetFolder + "\\"+ sourceLocation.getName());            
            // 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();
            noOfFiles++;
        }
    }

    public static void main(String[] args) throws IOException {

        File srcFolder = new File("C:\\sourceLocation\\");
        String destFolder = new String("C:\\targetLocation\\");
        CopyFiles cf = new CopyFiles();
        cf.copyDirectory(srcFolder, destFolder);
        System.out.println("No Of Files got Retrieved from Source ::"+cf.noOfFiles);
        System.out.println("Successfully Retrieved");
    }
}
2

Java 8

        Path destinationepath = Paths.get("C:\\data\\temp\\destinationDir");        
        Files.walk(sourcepath)
             .forEach(source -> copy(source, destinationepath.resolve(sourcepath.relativize(source)))); 

Copy Method

static void copy(Path source, Path dest) {
        try {
            Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }
18

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

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

}
Я использую Ubuntu 8.10, так что это не должно быть проблемой. user42155
@gemm, Destfile должен быть точным путем, куда файл должен быть скопирован. Это означает включение нового имени файла не только в каталог, в который вы хотите скопировать файл.
Если вы уверены, что ваш код никогда не будет работать на другой платформе.
Но разве в Windows нет ошибки, связанной с передачей, из-за которой невозможно скопировать потоки размером более 64 МБ одним куском?bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442 фиксироватьrgagnon.com/javadetails/java-0064.html
Привет, я пробовал это, но я получаю сообщения об ошибках: java.io.FileNotFoundException: ... путь к trDir ... (каталог) Все в моем файле и папках, кажется, все в порядке. Вы знаете, что происходит не так, и почему я это понимаю? user42155
6
import static java.nio.file.StandardCopyOption.*;
...
Files.copy(source, target, REPLACE_EXISTING);

https://docs.oracle.com/javase/tutorial/essential/io/copy.html

1

вам нужно просто указать источник и место назначения.

import java.io.*;

public class CopyData {
static String source;
static String des;

static void dr(File fl,boolean first) throws IOException
{
    if(fl.isDirectory())
    {
        createDir(fl.getPath(),first);
        File flist[]=fl.listFiles();
        for(int i=0;i<flist.length;i++)
        {

            if(flist[i].isDirectory())
            {
                dr(flist[i],false);
            }

            else
            {

                copyData(flist[i].getPath());
            }
        }
    }

    else
    {
        copyData(fl.getPath());
    }
}

private static void copyData(String name) throws IOException {

        int i;
        String str=des;
        for(i=source.length();i<name.length();i++)
        {
            str=str+name.charAt(i);
        }
        System.out.println(str);
        FileInputStream fis=new FileInputStream(name);
        FileOutputStream fos=new FileOutputStream(str);
        byte[] buffer = new byte[1024];
        int noOfBytes = 0;
         while ((noOfBytes = fis.read(buffer)) != -1) {
             fos.write(buffer, 0, noOfBytes);
         }


}

private static void createDir(String name, boolean first) {

    int i;

    if(first==true)
    {
        for(i=name.length()-1;i>0;i--)
        {
            if(name.charAt(i)==92)
            {
                break;
            }
        }

        for(;i<name.length();i++)
        {
            des=des+name.charAt(i);
        }
    }
    else
    {
        String str=des;
        for(i=source.length();i<name.length();i++)
        {
            str=str+name.charAt(i);
        }
        (new File(str)).mkdirs();
    }

}

public static void main(String args[]) throws IOException
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("program to copy data from source to destination \n");
    System.out.print("enter source path : ");
    source=br.readLine();
    System.out.print("enter destination path : ");
    des=br.readLine();
    long startTime = System.currentTimeMillis();
    dr(new File(source),true);
    long endTime   = System.currentTimeMillis();
    long time=endTime-startTime;
    System.out.println("\n\n Time taken = "+time+" mili sec");
}

}

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

Вы забыли закрыть FileInputStream и FileOutputStream в copyData.
14

Apache Commons Fileutils 

copying file from one directory to another directory.

use copyFileToDirectory(File srcFile, File destDir)

copying directory from one directory to another directory.

use copyDirectory(File srcDir, File destDir)

copying contents of one file to another

use static void copyFile(File srcFile, File destFile)

4

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

public class CopyFiles {
 public static void copyFiles(File sourceLocation , File targetLocation)
    throws IOException {

        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists()) {
                targetLocation.mkdir();
            }
            File[] files = sourceLocation.listFiles();
            for(File file:files){
                InputStream in = new FileInputStream(file);
                OutputStream out = new FileOutputStream(targetLocation+"/"+file.getName());

                // Copy the bits from input stream to output stream
                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                in.close();
                out.close();
            }            
        }
    }
1
0

File destFile = new File(targetDir.getAbsolutePath() + File.separator
    + file.getName());
try {
  showMessage("Copying " + file.getName());
  in = new BufferedInputStream(new FileInputStream(file));
  out = new BufferedOutputStream(new FileOutputStream(destFile));
  int n;
  while ((n = in.read()) != -1) {
    out.write(n);
  }
  showMessage("Copied " + file.getName());
} catch (Exception e) {
  showMessage("Cannot copy file " + file.getAbsolutePath());
} finally {
  if (in != null)
    try {
      in.close();
    } catch (Exception e) {
    }
  if (out != null)
    try {
      out.close();
    } catch (Exception e) {
    }
}
0

каталога в другой

public static void copyFile(File sourceFile, File destFile) throws IOException {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(sourceFile);
            out = new FileOutputStream(destFile);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }
        } catch(Exception e){
            e.printStackTrace();
        }
        finally {
            in.close();
            out.close();
        }
    }
26

Java Советы довольно прямо вперед. С тех пор я переключился на 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();
        }
    }
Спасибо, лучше проверить, еслиsourceLocation.exists() в случае предотвращенияjava.io.FileNotFoundException
Спасибо, но я не хочу копировать каталог - только файлы в нем. Теперь я получаю сообщения об ошибках java.io.FileNotFoundException: (путь к trDir) (это каталог) Это то, что он только говорит. Я использовал такой метод: copyDirectory (review, trDir); user42155
5

move files из исходного в целевой каталог, а не копировать весь каталог, вы можете сделать:

for (File srcFile: srcDir.listFiles()) {
    if (srcFile.isDirectory()) {
        FileUtils.copyDirectoryToDirectory(srcFile, dstDir);
    } else {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}

Если вы хотите пропустить каталоги, вы можете сделать:

for (File srcFile: srcDir.listFiles()) {
    if (!srcFile.isDirectory()) {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}
copyFileToDirectory не «перемещает» файл
1

FileChannel source=new FileInputStream(new File("source file path")).getChannel();
FileChannel desti=new FileOutputStream(new File("destination file path")).getChannel();
desti.transferFrom(source, 0, source.size());
source.close();
desti.close();
0

    public static void main(String[] args) {

    String sourceFolder = "E:\\Source";
    String targetFolder = "E:\\Target";
    File sFile = new File(sourceFolder);
    File[] sourceFiles = sFile.listFiles();
    for (File fSource : sourceFiles) {
        File fTarget = new File(new File(targetFolder), fSource.getName());
        copyFileUsingStream(fSource, fTarget);
        deleteFiles(fSource);
    }
}

    private static void deleteFiles(File fSource) {
        if(fSource.exists()) {
            try {
                FileUtils.forceDelete(fSource);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void copyFileUsingStream(File source, File dest) {
        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(source);
            os = new FileOutputStream(dest);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
        } catch (Exception ex) {
            System.out.println("Unable to copy file:" + ex.getMessage());
        } finally {
            try {
                is.close();
                os.close();
            } catch (Exception ex) {
            }
        }
    }
1

CommonMultipartFile в папку и скопируйте этот файл в папку назначения в папке веб-проекта webapps (i.e),

    String resourcepath = "C:/resources/images/" + commonsMultipartFile.getOriginalFilename();

    File file = new File(resourcepath);
    commonsMultipartFile.transferTo(file);

    //Copy File to a Destination folder
    File destinationDir = new File("C:/Tomcat/webapps/myProject/resources/images/");
    FileUtils.copyFileToDirectory(file, destinationDir);
0
    File file = fileChooser.getSelectedFile();
    String selected = fc.getSelectedFile().getAbsolutePath();
     File srcDir = new File(selected);
     FileInputStream fii;
     FileOutputStream fio;
    try {
         fii = new FileInputStream(srcDir);
         fio = new FileOutputStream("C:\\LOvE.txt");
         byte [] b=new byte[1024];
         int i=0;
        try {
            while ((fii.read(b)) > 0)
            {

              System.out.println(b);
              fio.write(b);
            }
            fii.close();
            fio.close();
Что такоеfileChooser?
2

org.apache.commons.io.FileUtils

Это так удобно

Если вы собираетесь опубликовать ответ с предложением библиотеки, было бы неплохо, если бы вы на самом деле объяснили, как ее использовать, а не просто упомянули ее название.
9
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();
Спасибо @Clocker
чистый, простой ответ - никаких дополнительных зависимостей.
11

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

File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);

Похожие вопросы