Copia di file da una directory all'altra in Java


156

Voglio copiare i file da una directory all'altra (sottodirectory) usando Java. Ho una directory, dir, con file di testo. Ierate sui primi 20 file in dir e voglio copiarli in un'altra directory nella directory dir, che ho creato proprio prima dell'iterazione. Nel codice, voglio copiare il review(che rappresenta il file di testo o la recensione) in trainingDir. Come posso fare questo? Sembra che non ci sia una tale funzione (o non riuscivo a trovare). Grazie.

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

}

Quindi, hai una directory piena di file e vuoi solo copiare questi file? Nessuna ricorsione sul lato input - ad esempio copiare tutto da sottodir in una directory principale?
Akarnokd,

Si, esattamente. Sono interessato sia a copiare o spostare questi file in un'altra directory (anche se nel post ho chiesto solo di copiare).
user42155,

3
Aggiornamento dal futuro. Java 7 ha una funzione della classe Files per copiare i file. Ecco un altro post su di esso stackoverflow.com/questions/16433915/...~~V~~aux~~singular~~3rd
kevinl

Risposte:


170

Per ora questo dovrebbe risolvere il tuo problema

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

FileUtilsclasse dalla libreria commons-io di apache , disponibile dalla versione 1.2.

L'uso di strumenti di terze parti invece di scrivere da soli tutte le utilità sembra essere un'idea migliore. Può risparmiare tempo e altre risorse preziose.


FileUtils non ha funzionato per me. fonte ho preso come "E: \\ Users \\ users.usr" e destinazione come "D: \\ users.usr". Quale potrebbe essere il problema?
JAVA

2
Bella soluzione, per me, funziona quando cambio FileUtils.copyDirectory(source,dest)a FileUtils.copyFile(source, dest), questo può creare directory se non esiste
yuqizhang

FileUtils.copyDirectory copia solo i file nella directory e non nelle sottodirectory. FileUtils.copyDirectoryStructure copia tutti i file e le sottodirectory
Homayoun Behzadian,

41

Non esiste un metodo di copia dei file nell'API standard (ancora). Le tue opzioni sono:

  • Scrivilo tu stesso, usando un FileInputStream, un FileOutputStream e un buffer per copiare byte dall'uno all'altro - o meglio ancora, usa FileChannel.transferTo ()
  • FileUtils dell'utente Apache Commons
  • Attendere NIO2 in Java 7

+1 per NIO2: sto sperimentando NIO2 / Java7 in questi giorni .. e il nuovo Path è molto ben progettato
dfa

OK, come si fa in Java 7? Il collegamento NIO2 è ora interrotto.
ripper234

5
@ ripper234: collegamento corretto. Nota che ho trovato il nuovo link inserendo "java nio2" in Google ...
Michael Borgwardt,

Per il link di Apache Commons, penso che intendessi collegarti a "#copyDirectory (java.io.File, java.io.File)"
kostmo,

37

In Java 7, non v'è un metodo standard per copiare i file in java:

Files.copy.

Si integra con l'I / O nativo O / S per prestazioni elevate.

Vedi il mio modo conciso A su Standard per copiare un file in Java? per una descrizione completa dell'uso.


6
Questo non affronta la questione della copia di intere directory.
Charlie,

Sì, lo fa ... se segui il link. Non dimenticare che un "File" in Java può rappresentare una directory o un file, è solo un riferimento.
gagarwa,

"Se il file è una directory, crea una directory vuota nella posizione di destinazione (le voci nella directory non vengono copiate)"
yurez

27

L'esempio seguente di Java Tips è piuttosto semplice. Da allora sono passato a Groovy per le operazioni relative al file system - molto più semplice ed elegante. Ma ecco i suggerimenti Java che ho usato in passato. Manca la solida gestione delle eccezioni necessaria per renderlo infallibile.

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

Grazie, ma non voglio copiare la directory - solo i file in essa contenuti. Ora ricevo messaggi di errore java.io.FileNotFoundException: (il percorso di trDir) (è una directory) Questo è solo ciò che dice. Ho usato il metodo in questo modo: copyDirectory (review, trDir);
user42155,

Grazie, meglio controllare se sourceLocation.exists()per prevenirejava.io.FileNotFoundException
Sdghasemi

19

Se si desidera copiare un file e non spostarlo, è possibile codificare in questo modo.

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

}

Ciao, ho provato questo, ma ottengo messaggi di errore: java.io.FileNotFoundException: ... percorso a trDir ... (È una directory) Tutto nel mio file e nelle mie cartelle sembra essere ok. Sai cosa non va e perché lo capisco?
user42155,

Ma non c'è un bug di Windows attorno al trasferimento? Non riesci a copiare stream più grandi di 64 MB in un unico pezzo? bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442 correzione rgagnon.com/javadetails/java-0064.html
akarnokd

Sto usando Ubuntu 8.10, quindi questo non dovrebbe essere il problema.
user42155,

Se sei sicuro che il tuo codice non verrà mai eseguito su piattaforme diverse.
Akarnokd,

@gemm il destfile deve essere il percorso esatto in cui il file deve essere copiato. Ciò significa che includere il nuovo nome file non solo la directory in cui si desidera copiare il file.
Janusz,

18

Spring Framework ha molte classi util simili come Apache Commons Lang. Quindi c'èorg.springframework.util.FileSystemUtils

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

15

apache commons Fileutils è utile. puoi fare le seguenti attività.

  1. copia di file da una directory a un'altra directory.

    uso copyFileToDirectory(File srcFile, File destDir)

  2. copia della directory da una directory a un'altra directory.

    uso copyDirectory(File srcDir, File destDir)

  3. copia del contenuto di un file in un altro

    uso static void copyFile(File srcFile, File destFile)


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

1
risposta semplice e pulita, senza dipendenze extra.
Clocker,

Per favore, potresti descrivere le prime 2 righe!
AVA


8

I comuni di Apache FileUtils saranno utili, se si desidera spostare solo i file dalla sorgente alla directory di destinazione anziché copiare l'intera directory, è possibile fare:

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

Se vuoi saltare le directory, puoi fare:

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

2
copyFileToDirectory non "sposta" il file
aleb

7

Sembra che tu stia cercando la soluzione semplice (una buona cosa). Consiglio di usare FileUtils.copyDirectory di Apache Common :

Copia un'intera directory in una nuova posizione preservando le date del file.

Questo metodo copia la directory specificata e tutti i relativi file e directory figlio nella destinazione specificata. La destinazione è la nuova posizione e il nome della directory.

La directory di destinazione viene creata se non esiste. Se la directory di destinazione esisteva, questo metodo unisce l'origine alla destinazione, con l'origine che ha la precedenza.

Il tuo codice potrebbe essere bello e semplice come questo:

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

FileUtils.copyDirectory(srcDir, trgDir);

Ciao, non voglio copiare la directory - solo i file in essa contenuti.
user42155

È praticamente la stessa cosa, no? Tutti i file dalla directory di origine finiranno nella directory di destinazione.
Stu Thompson,

1
Questo è un metodo molto migliore rispetto alla lettura e alla scrittura dei file. +1
Optimus Prime,

6

Ispirato dalla risposta di Mohit in questo thread . Applicabile solo per Java 8.

Quanto segue può essere usato per copiare tutto ricorsivamente da una cartella all'altra:

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 in stile streaming.

Aggiornamento 2019-06-10: nota importante - chiudi lo stream (ad es. Usando try-with-resource) acquisito dalla chiamata Files.walk. Grazie a @jannis per il punto.


Eccezionale!! usa Streaming parallelo se qualcuno vuole copiare directory che ha milioni di file. Posso mostrare facilmente l'avanzamento della copia dei file, ma nel comando jAVA 7 nio copyDirectory, per la grande directory non sono stato in grado di mostrare i progressi per gli utenti.
Aqeel Haider

1
Suggerisco di chiudere lo stream restituito da Files.walk(source)come consigliato nei documenti o potresti avere problemi
jannis

4

Di seguito è riportato il codice modificato di Brian che copia i file dalla posizione di origine alla posizione di destinazione.

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

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

Metodo di copia

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

3

Puoi risolvere il problema copiando il file di origine in un nuovo file ed eliminando l'originale.

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

2

Uso

org.apache.commons.io.FileUtils

È così utile


4
Se hai intenzione di pubblicare una risposta che suggerisce una biblioteca, sarebbe bello se davvero spiegassi come usarlo invece di menzionarne semplicemente il nome.
Viene visualizzato il

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


1

utilizzo il seguente codice per trasferire un file caricato CommonMultipartFilein una cartella e copiarlo in una cartella di destinazione nella cartella del progetto Web Webapps (ad esempio),

    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

Copia il file da una directory a un'altra directory ...

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

qui è semplicemente un codice Java per copiare i dati da una cartella all'altra, devi solo dare l'input della fonte e della destinazione.

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

}

questo è un codice funzionante per quello che vuoi ... fammi sapere se ha aiutato


Hai dimenticato di chiudere FileInputStream e FileOutputStream in copyData.
everblack,

0

È possibile utilizzare il seguente codice per copiare i file da una directory a un'altra

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

Che cosa è fileChooser?
Dinoop paloli,

0

codice seguente per copiare i file da una directory all'altra

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

Neanche così complicato e nessuna importazione richiesta in Java 7:

Il renameTo( )metodo cambia il nome di un file:

public boolean renameTo( File destination)

Ad esempio, per modificare il nome del file src.txtnella directory di lavoro corrente in dst.txt, scrivere:

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

Questo è tutto.

Riferimento:

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


2
Lo spostamento non sta copiando.
Nathan Tuggy,

Questo sposterà il file. Risposta sbagliata !
smilyface,

Come specificato nei commenti sulla domanda, lo spostamento funzionerà per OP.
Mohit Kanwar,

Eseguito l'upgrade, perché si adatta al mio problema ed è la risposta più semplice là fuori per lo spostamento di file. Grazie amico
LevKaz,

Per favore, rispondi alla domanda
Shaktisinh Jadeja

0

È possibile utilizzare il seguente codice per copiare i file da una directory a un'altra

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

Dopo la funzione ricorsiva che ho scritto, se aiuta qualcuno. Copierà tutti i file all'interno di sourcedirectory in destinationDirectory.

esempio:

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

Se non si desidera utilizzare librerie esterne e si desidera utilizzare le classi java.io anziché java.nio, è possibile utilizzare questo metodo conciso per copiare una cartella e tutto il suo contenuto:

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

Il modo migliore per quanto ne so è il seguente:

    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) {
            }
        }
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.