Copie des fichiers d'un répertoire à un autre en Java

je veux copier des fichiers d'un répertoire à un autre (sous-répertoire) en utilisant Java. J'ai un répertoire, dir, avec des fichiers texte. J'itère les 20 premiers fichiers dans dir, et je veux les copier dans un autre répertoire du répertoire dir, que j'ai créé juste avant l'itération. Dans le code, je veux copier le review (qui représente le ième fichier texte ou examen) trainingDir . Comment puis-je faire cela? Il ne semble pas y avoir une telle fonction (ou je n'ai pas pu trouver). Remercier.

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];

}
129
demandé sur akarnokd 2009-07-18 03:38:43

29 réponses

pour l'instant cela devrait résoudre votre problème

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 classe apache commons-io de la bibliothèque, disponible depuis la version 1.2.

utiliser des outils tiers au lieu d'écrire tous les utilitaires par nous-mêmes semble être une meilleure idée. Il peut gagner du temps et d'autres ressources précieuses.

141
répondu Arun P Johny 2014-06-02 15:30:39

il n'y a pas de méthode de copie de fichier dans L'API Standard (encore). Vos options sont:

  • écrivez - le vous-même, en utilisant un FileInputStream, un FileOutputStream et un tampon pour copier des octets de l'un à l'autre-ou encore mieux, utilisez FileChannel.transferTo ()
  • User Apache Commons' FileUtils
  • Attendre NIO2 dans Java 7
38
répondu Michael Borgwardt 2013-08-14 00:34:15

en Java 7, il est une méthode standard pour copier des fichiers en java:

"151950920 de Fichiers".copie.

il s'intègre avec o/s native I/O pour une haute performance.

Voir mon Un sur Standard manière concise pour copier un fichier en Java? pour une description complète de l'utilisation.

28
répondu Glen Best 2017-05-23 12:34:41

l'exemple ci-dessous tiré de Java Tips est assez simple. Depuis, je suis passé à Groovy pour les opérations traitant du système de fichiers - beaucoup plus facile et élégant. Mais voici le Java Tips que j'ai utilisé dans le passé. Il lui manque la gestion d'exception robuste qui est nécessaire pour le rendre infaillible.

 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();
        }
    }
26
répondu Brian 2009-07-18 00:03:04

si vous voulez copier un fichier et ne pas le déplacer, vous pouvez coder comme ceci.

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

}
16
répondu Janusz 2009-07-17 23:59:16

apache commons Fileutils est à portée de main. vous pouvez faire des activités ci-dessous.

  1. la copie des fichiers d'un répertoire vers un autre répertoire.

    utiliser copyFileToDirectory(File srcFile, File destDir)

  2. copie de répertoire d'un répertoire vers un autre répertoire.

    utiliser copyDirectory(File srcDir, File destDir)

  3. copier le contenu d'un fichier un autre

    utiliser static void copyFile(File srcFile, File destFile)

14
répondu Balaswamy Vaddeman 2011-11-09 12:14:14
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();
8
répondu Shaktisinh Jadeja 2017-05-10 15:57:18

vous semblez être à la recherche de la solution simple (une bonne chose). Je recommande D'utiliser les fichiers D'Apache Common.répertoire :

copie un répertoire entier à un nouveau lieu de conservation des dates du fichier.

cette méthode copie la méthode annuaire et tous ses enfants répertoires et fichiers vers les fichiers spécifiés destination. La destination est l' nouvel emplacement et le nom de l' répertoire.

le répertoire de destination est créé si elle n'existe pas. Si l' le répertoire de destination existait, alors cette méthode fusionne la source avec la destination, avec la source prendre préséance.

votre code pourrait être aussi simple que ceci:

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

FileUtils.copyDirectory(srcDir, trgDir);
7
répondu Stu Thompson 2013-08-16 14:14:27

Spring Framework possède de nombreuses classes util similaires comme Apache Commons Lang. Donc il y a org.springframework.util.FileSystemUtils

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);
7
répondu Igor Rybak 2017-07-19 14:00:41
import static java.nio.file.StandardCopyOption.*;
...
Files.copy(source, target, REPLACE_EXISTING);

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

5
répondu gagarwa 2015-06-11 18:26:09

Apache communs FileUtils sera pratique, si vous voulez seulement à déplacer des fichiers de la source au répertoire cible plutôt que de copier l'ensemble du répertoire, vous pouvez faire:

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

si vous voulez sauter des répertoires, vous pouvez le faire:

for (File srcFile: srcDir.listFiles()) {
    if (!srcFile.isDirectory()) {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}
5
répondu NoUserFound 2017-05-10 15:58:11

ci-dessous est le code modifié de Brian qui copie les fichiers de l'emplacement de la source à l'emplacement de la destination.

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();
            }            
        }
    }
4
répondu thamizhannal 2011-03-07 17:48:00

vous pouvez contourner en copiant le fichier source dans un nouveau fichier et supprimer l'original.

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();
    }
 }
}
3
répondu Guy Ben-Shahar 2015-12-01 11:41:46

Inspiré par Mohit réponse dans ce fil . Applicable seulement pour Java 8.

ce qui suit peut être utilisé pour copier tout de façon récursive d'un dossier à un autre:

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

Stream-style FTW.

3
répondu shidzo 2017-05-23 12:10:43

Utiliser

org.apache.commons.io.FileUtils

C'est donc à portée de main

2
répondu Bhimesh 2012-05-30 08:31:14
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();
    }
}
2
répondu mital 2013-05-06 16:35:33

Java 8

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

Méthode De La Copie

static void copy(Path source, Path dest) {
        try {
            Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }
2
répondu Niraj Sonawane 2018-05-31 02:58:32

les classes NIO rendent cela assez simple.

http://www.javalobby.org/java/forums/t17036.html

1
répondu Nate 2009-07-17 23:46:13

j'utilise le code suivant pour transférer un CommonMultipartFile téléchargé dans un dossier et copier ce fichier dans un dossier de destination dans webapps (I. e) web project folder,

    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);
1
répondu lk.annamalai 2012-11-29 15:49:16

copie le fichier d'un répertoire à un autre...

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();
1
répondu Rajneesh Mishra 2016-05-13 02:38:57

voici simplement un code java pour copier des données d'un dossier à l'autre, vous devez simplement donner l'entrée de la source et de la destination.

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

}

c'est un code fonctionnel pour ce que vous voulez..faites-moi savoir si cela a aidé

1
répondu Nikunj Gupta 2016-09-17 13:06:51

, Vous pouvez utiliser le code suivant pour copier des fichiers d'un répertoire à un autre

// 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
répondu Varun Bhatia 2013-03-04 08:26:26
    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();
0
répondu Nithin 2013-07-17 08:19:09

code suivant pour copier des fichiers d'un répertoire à un autre

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
répondu Dhrumil Shah 2013-08-12 12:59:43
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");
    }
}
0
répondu Harinath Reddy 2014-12-11 09:39:57

pas même que compliqué et aucune importation requise En Java 7:

la méthode renameTo( ) change le nom d'un fichier:

public boolean renameTo( File destination)

par exemple, pour changer le nom du fichier src.txt dans le répertoire courant de travail en dst.txt , vous écririez:

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

C'est ça.

référence:

Harold, Elliotte Rusty (2006-05-16). Java I / O( P. 393). O'Reilly Media. L'Édition Kindle.

0
répondu Mr. Anderson 2015-07-24 15:43:52

, Vous pouvez utiliser le code suivant pour copier des fichiers d'un répertoire à un autre

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();
        }
    }
0
répondu Tanmay kumar shaw 2016-06-29 12:59:50

suivant la fonction récursive que j'ai écrite, si elle aide quelqu'un. Il copiera tous les fichiers de sourcedirectory vers destinationDirectory.

exemple:

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();
                }
            }
        }
    }
}
0
répondu Yogesh Sanchihar 2018-09-24 20:27:02

vous utilisez renameTo () – pas évident, je sais ... mais c'est L'équivalent Java de move ...

-3
répondu phatmanace 2009-07-17 23:54:23