it-swarm.com.de

Kopieren von Dateien aus einem Verzeichnis in ein anderes in Java

Ich möchte Dateien mit Java von einem Verzeichnis in ein anderes (Unterverzeichnis) kopieren. Ich habe ein Verzeichnis mit Textdateien. Ich durchlaufe die ersten 20 Dateien in dir und möchte sie in ein anderes Verzeichnis im Verzeichnis dir kopieren, das ich direkt vor der Iteration erstellt habe .. Im Code möchte ich die review (die den ith darstellt) kopieren Textdatei oder Überprüfung) an trainingDir. Wie kann ich das machen? Es scheint keine solche Funktion zu geben (oder ich konnte sie nicht finden). Vielen Dank.

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

}
135
user42155

Im Moment sollte dies Ihr Problem lösen

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 Klasse aus Apache commons-io library, verfügbar seit Version 1.2.

Die Verwendung von Tools von Drittanbietern, anstatt alle Dienstprogramme selbst zu schreiben, scheint eine bessere Idee zu sein. Es kann Zeit und andere wertvolle Ressourcen sparen.

146
Arun P Johny

Es gibt (noch) keine Dateikopiermethode in der Standard-API. Ihre Optionen sind:

  • Schreiben Sie es selbst, verwenden Sie einen FileInputStream, einen FileOutputStream und einen Puffer, um Bytes von einem zum anderen zu kopieren - oder besser noch, FileChannel.transferTo ()
  • FileUtils von Benutzer-Apache Commons
  • Warten Sie in Java 7 auf NIO2
38

In Java 7 ist is eine Standardmethode zum Kopieren von Dateien in Java: 

Files.copy. 

Es ist in O/S native E/A integriert, um eine hohe Leistung zu erzielen. 

Sehen Sie mein A auf Standard, um eine Datei in Java zu kopieren? für eine vollständige Beschreibung der Verwendung. 

30
Glen Best

Das folgende Beispiel aus Java Tips ist ziemlich einfach. Ich bin seither zu Groovy gewechselt, was das Dateisystem betrifft - viel einfacher und eleganter. Aber hier sind die Java-Tipps, die ich früher verwendet habe. Es verfügt nicht über die robuste Ausnahmebehandlung, die erforderlich ist, um sie narrensicher zu machen. 

 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
Brian

Wenn Sie eine Datei kopieren und nicht verschieben möchten, können Sie wie folgt Code schreiben.

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

}
18
Janusz

Apache commons Fileutils ist praktisch . Sie können folgende Aktivitäten ausführen.

  1. kopieren der Datei von einem Verzeichnis in ein anderes Verzeichnis.

    benutze copyFileToDirectory(File srcFile, File destDir)

  2. verzeichnis von einem Verzeichnis in ein anderes Verzeichnis kopieren.

    benutze copyDirectory(File srcDir, File destDir) 

  3. inhalte einer Datei in eine andere kopieren

    benutze static void copyFile(File srcFile, File destFile)

14

Spring Framework hat viele ähnliche Nutzungsklassen wie Apache Commons Lang. Es gibt also org.springframework.util.FileSystemUtils 

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);
11
Igor Rybak
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();
9

Sie scheinen nach der einfachen Lösung zu suchen (eine gute Sache). Ich empfehle die Verwendung von Apache Common's FileUtils.copyDirectory :

Kopiert ein ganzes Verzeichnis in ein neues Speicherort der Dateidaten.

Diese Methode kopiert das angegebene Verzeichnis und sein ganzes Kind Verzeichnisse und Dateien auf die angegebene Ziel. Das Ziel ist das neuer Ort und Name der Verzeichnis.

Das Zielverzeichnis wird erstellt wenn es nicht existiert Wenn der Das Zielverzeichnis war vorhanden, dann Diese Methode führt die Quelle mit der .__ zusammen. Ziel, wobei die Quelle nimmt Vorrang.

Ihr Code könnte Nice and simple so aussehen:

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

FileUtils.copyDirectory(srcDir, trgDir);
7
Stu Thompson
import static Java.nio.file.StandardCopyOption.*;
...
Files.copy(source, target, REPLACE_EXISTING);

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

6
gagarwa

Apache Commons FileUtils ist praktisch, wenn Sie nur Dateien von der Quelle in das Zielverzeichnis verschieben möchten, anstatt das gesamte Verzeichnis zu kopieren, können Sie Folgendes tun:

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

Wenn Sie Verzeichnisse überspringen möchten, können Sie Folgendes tun:

for (File srcFile: srcDir.listFiles()) {
    if (!srcFile.isDirectory()) {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}
5
NoUserFound

Unten ist der geänderte Code von Brian, der Dateien vom Quell- zum Zielort kopiert.

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
thamizhannal

Inspiriert von Mohits Antwort in diesem Thread . Gilt nur für Java 8.

Folgendes kann verwendet werden, um alles rekursiv von einem Ordner in einen anderen zu kopieren:

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.

4
shidzo

Sie können das Problem umgehen, indem Sie die Quelldatei in eine neue Datei kopieren und das Original löschen.

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
Guy Ben-Shahar
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
mital

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

Kopiermethode  

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
Niraj Sonawane

Benutzen 

org.Apache.commons.io.FileUtils

Es ist so praktisch

2
Bhimesh

Datei von einem Verzeichnis in ein anderes Verzeichnis kopieren ...

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
Rajneesh Mishra

hier ist einfach ein Java-Code, um Daten von einem Ordner in einen anderen zu kopieren. Sie müssen nur die Eingabe von Quelle und Ziel angeben.

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

}

dies ist ein funktionierender Code für das, was Sie wollen. Lassen Sie mich wissen, ob es geholfen hat

1
Nikunj Gupta

Die NIO-Klassen machen dies ziemlich einfach. 

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

1
Nate

ich verwende den folgenden Code, um eine hochgeladene CommonMultipartFile in einen Ordner zu übertragen und diese Datei in einen Zielordner im webapps (d. h.) Webprojektordner zu kopieren.

    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
lk.annamalai

Nach meinem Wissen ist der beste Weg wie folgt:

    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) {
            }
        }
    }
0
Pankaj

Nicht einmal das komplizierte und keine Importe erforderlich in Java 7:

Die renameTo( ) -Methode ändert den Namen einer Datei:

public boolean renameTo( File destination)

Um beispielsweise den Namen der Datei zu ändern, src.txt im aktuellen Arbeitsverzeichnis zu dst.txt, du würdest schreiben:

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

Das ist es.

Referenz:

Harold, Elliotte Rusty (2006-05-16). Java I/O (S. 393). O'Reilly Media. Kindle Edition.

0
Mr. Anderson

Wenn Sie keine externen Bibliotheken verwenden möchten und anstelle von Java.nio-Klassen Java.io verwenden möchten, können Sie mit dieser prägnanten Methode einen Ordner und dessen gesamten Inhalt kopieren:

/**
 * 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
Domenico

Sie können den folgenden Code verwenden, um Dateien von einem Verzeichnis in ein anderes zu kopieren

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

folgenden Code, um Dateien von einem Verzeichnis in ein anderes zu kopieren

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
Dhrumil Shah

Nach rekursiver Funktion habe ich geschrieben, ob es jemandem hilft. Es werden alle Dateien im Quellverzeichnis in das Zielverzeichnis kopiert.

beispiel:

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

Sie können den folgenden Code verwenden, um Dateien von einem Verzeichnis in ein anderes zu kopieren

// 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
Varun Bhatia
    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
Nithin
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
Harinath Reddy