Copiando arquivos de um diretório para outro em Java

156

Eu quero copiar arquivos de um diretório para outro (subdiretório) usando Java. Eu tenho um diretório, dir, com arquivos de texto. Eu itero os 20 primeiros arquivos no diretório e quero copiá-los para outro diretório no diretório dir, que eu criei antes da iteração. No código, quero copiar o review(que representa o i-ésimo arquivo de texto ou revisão) para trainingDir. Como posso fazer isso? Parece não haver essa função (ou eu não consegui encontrar). Obrigado.

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
fonte
Então, você tem um diretório cheio de arquivos e deseja copiar apenas esses arquivos? Nenhuma recursão no lado da entrada - por exemplo, copiar tudo de subdiretórios em um diretório principal?
Akarnokd
Sim, exatamente. Estou interessado em apenas copiar ou mover esses arquivos para outro diretório (embora no post eu tenha solicitado apenas a cópia).
user42155
3
Atualização do futuro. O Java 7 possui um recurso da classe Arquivos para copiar arquivos. Aqui está outro post sobre isso stackoverflow.com/questions/16433915/...
KevinL

Respostas:

170

Por enquanto, isso deve resolver seu 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 da biblioteca apache commons-io , disponível desde a versão 1.2.

Usar ferramentas de terceiros em vez de escrever todos os utilitários por conta própria parece ser uma idéia melhor. Pode economizar tempo e outros recursos valiosos.

Arun P Johny
fonte
O FileUtils não funcionou para mim. a origem foi tomada como "E: \\ Users \\ users.usr" e o destino como "D: \\ users.usr". qual poderia ser o problema?
JAVA
2
Agradável solução, para mim, ele funciona quando eu mudo FileUtils.copyDirectory(source,dest)a FileUtils.copyFile(source, dest), isso pode criar diretório se ele não existe
yuqizhang
O FileUtils.copyDirectory copia apenas arquivos no diretório e não nos subdiretórios. O FileUtils.copyDirectoryStructure copia todos os arquivos e subdiretórios
Homayoun Behzadian
41

Ainda não existe um método de cópia de arquivo na API padrão. Suas opções são:

  • Escreva você mesmo, usando um FileInputStream, um FileOutputStream e um buffer para copiar bytes de um para o outro - ou melhor ainda, use FileChannel.transferTo ()
  • Usuário FileUtils do Apache Commons
  • Aguarde NIO2 em Java 7
Michael Borgwardt
fonte
+1 para o NIO2: atualmente estou experimentando o NIO2 / Java7 .. e o novo Path é muito bem projetado
dfa 17/07/2009
OK, como fazer isso no Java 7? O link NIO2 agora está quebrado.
precisa saber é o seguinte
5
@ ripper234: link corrigido. Note que eu encontrei a nova ligação, digitando "java nio2" no Google ...
Michael Borgwardt
Para o link do Apache Commons, acho que você pretendia vincular ao "#copyDirectory (java.io.File, java.io.File)"
kostmo 17/02/2012
37

Em Java 7, não é um método padrão para copiar arquivos em java:

Files.copy.

Ele se integra à E / S nativa de O / S para obter alto desempenho.

Veja minha maneira concisa A no padrão de copiar um arquivo em Java? para uma descrição completa do uso.

Glen Best
fonte
6
Isso não trata da questão de copiar diretórios inteiros.
Charlie
Sim, sim ... se você seguir o link. Não esqueça que um "Arquivo" em java pode representar um diretório ou arquivo, é apenas uma referência.
precisa saber é
"Se o arquivo é um diretório, ele cria um diretório vazio no local de destino (as entradas no diretório não são copiadas)"
yurez 08/04/19
27

O exemplo abaixo do Java Tips é bastante direto. Desde então, mudei para o Groovy para operações que lidam com o sistema de arquivos - muito mais fácil e elegante. Mas aqui está o Java Tips que eu usei no passado. Não possui o tratamento robusto de exceção necessário para torná-lo à prova de idiotas.

 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();
        }
    }
Brian
fonte
Obrigado, mas não quero copiar o diretório - apenas os arquivos nele. Agora recebo mensagens de erro java.io.FileNotFoundException: (o caminho para trDir) (é um diretório) É o que diz apenas isso. Eu usei o método como este: copyDirectory (review, trDir);
user42155
Obrigado, melhor para verificar se sourceLocation.exists(), no caso para evitarjava.io.FileNotFoundException
Sdghasemi
19

Se você deseja copiar um arquivo e não movê-lo, pode codificar desta maneira.

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

}
Janusz
fonte
Oi, eu tentei isso, mas recebo mensagens de erro: java.io.FileNotFoundException: ... caminho para trDir ... (é um diretório) Tudo no meu arquivo e pastas parece estar ok. Você sabe o que está errado, e por que eu entendi isso?
user42155
Mas não há um bug do Windows ao redor da transferência; não é possível copiar fluxos maiores que 64 MB em uma única peça? bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442 correção rgagnon.com/javadetails/java-0064.html
akarnokd
Estou usando o Ubuntu 8.10, então esse não deve ser o problema.
user42155
Se você tem certeza de que seu código nunca será executado em uma plataforma diferente.
Akarnokd
@gemm o destfile deve ser o caminho exato para o qual o arquivo deve ser copiado. Isso significa incluir o novo nome do arquivo, não apenas o diretório para o qual você deseja copiar o arquivo.
Janusz
18

O Spring Framework possui muitas classes de utilitários semelhantes, como o Apache Commons Lang. Então aí estáorg.springframework.util.FileSystemUtils

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

O apache commons Fileutils é útil. você pode fazer as atividades abaixo.

  1. copiar arquivo de um diretório para outro diretório.

    usar copyFileToDirectory(File srcFile, File destDir)

  2. diretório de cópia de um diretório para outro diretório.

    usar copyDirectory(File srcDir, File destDir)

  3. copiar o conteúdo de um arquivo para outro

    usar static void copyFile(File srcFile, File destFile)

Balaswamy Vaddeman
fonte
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();
Shaktisinh Jadeja
fonte
1
resposta limpa e simples - sem dependências extras.
Clocker
Por favor, você poderia descrever as duas primeiras linhas!
AVA
8

O FileUtils do Apache commons será útil, se você quiser apenas mover arquivos do diretório de origem para o destino em vez de copiar o diretório inteiro, você pode:

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

Se você quiser pular diretórios, poderá:

for (File srcFile: srcDir.listFiles()) {
    if (!srcFile.isDirectory()) {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}
NoUserFound
fonte
2
O copyFileToDirectory não "move" o arquivo
aleb 30/09
7

Você parece estar procurando a solução simples (uma coisa boa). Eu recomendo usar o FileUtils.copyDirectory do Apache Common :

Copia um diretório inteiro para um novo local, preservando as datas do arquivo.

Este método copia o diretório especificado e todos os seus diretórios e arquivos filhos para o destino especificado. O destino é o novo local e nome do diretório.

O diretório de destino é criado se não existir. Se o diretório de destino existisse, esse método mesclaria a origem com o destino, com a origem prevalecendo.

Seu código pode ser agradável e simples assim:

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

FileUtils.copyDirectory(srcDir, trgDir);
Stu Thompson
fonte
Oi, eu não quero copiar o diretório - apenas os arquivos nele.
user42155
É basicamente a mesma coisa, não? Todos os arquivos do diretório de origem terminarão no diretório de destino.
Stu Thompson
1
Esse é um método muito melhor do que ler e depois gravar os arquivos. +1
Optimus Prime
6

Inspirado pela resposta de Mohit neste tópico . Aplicável apenas ao Java 8.

O seguinte pode ser usado para copiar tudo recursivamente de uma pasta para outra:

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 no estilo de fluxo.

Atualize 2019-06-10: observação importante - feche o fluxo (por exemplo, tente com recurso) adquirido pela chamada Files.walk. Obrigado a @jannis pela questão.

xzt
fonte
Impressionante!! use Stream paralelo se alguém quiser copiar o diretório que possui milhões de arquivos. Posso mostrar o progresso da cópia de arquivos facilmente, mas no comando JAVA 7 nio copyDirectory, para o diretório grande, não consegui mostrar o progresso dos usuários.
Aqeel Haider
1
Sugiro fechar o fluxo retornado por Files.walk(source)como recomendado no docs ou você pode ficar em apuros
Jannis
4

Abaixo está o código modificado de Brian, que copia arquivos do local de origem para o local de destino.

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

Método de cópia

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

Você pode solucionar o problema com copiar o arquivo de origem para um novo arquivo e excluir o 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();
    }
 }
}
Guy Ben-Shahar
fonte
2

Usar

org.apache.commons.io.FileUtils

É tão útil

Bhimesh
fonte
4
Se você postar uma resposta sugerindo uma biblioteca, seria bom se você realmente explicasse como usá-la, em vez de apenas mencionar seu nome.
Pops)
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();
    }
}
mital
fonte
1

eu uso o código a seguir para transferir um upload CommonMultipartFilepara uma pasta e copiar esse arquivo para uma pasta de destino na pasta webapps (por exemplo, projeto web),

    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);
lk.annamalai
fonte
1

Copie o arquivo de um diretório para outro diretório ...

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();
Rajneesh Mishra
fonte
1

aqui é simplesmente um código java para copiar dados de uma pasta para outra, você precisa apenas fornecer a entrada da origem e do destino.

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

}

este é um código de trabalho para o que você quer ... deixe-me saber se ajudou

Nikunj Gupta
fonte
Você esqueceu de fechar o FileInputStream e o FileOutputStream no copyData.
everblack
0

Você pode usar o seguinte código para copiar arquivos de um diretório para outro

// 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();
     }
 }
Varun Bhatia
fonte
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();
Nithin
fonte
O que é fileChooser?
Dinoop paloli
0

código a seguir para copiar arquivos de um diretório para outro

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) {
    }
}
Dhrumil Shah
fonte
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");
    }
}
Harinath Reddy
fonte
0

Nem mesmo essa importação complicada e nenhuma necessária no Java 7:

O renameTo( )método altera o nome de um arquivo:

public boolean renameTo( File destination)

Por exemplo, para alterar o nome do arquivo src.txtno diretório de trabalho atual para dst.txt, você deve escrever:

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

É isso aí.

Referência:

Harold, Elliotte Rusty (2006-05-16). E / S Java (pág. 393). O'Reilly Media. Edição Kindle.

Sr. Anderson
fonte
2
Mover não é copiar.
Nathan Tuggy
Isso moverá o arquivo. Resposta errada !
smilyface
Conforme especificado nos comentários da pergunta, a mudança funcionará para o OP.
Mohit Kanwar
Voto positivo, porque se encaixa no meu próprio problema E é a resposta mais fácil para mover arquivos. Obrigado cara
LevKaz 17/04
Por favor, responda a pergunta
Shaktisinh Jadeja
0

Você pode usar o seguinte código para copiar arquivos de um diretório para outro

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();
        }
    }
Tanmay kumar shaw
fonte
0

Após a função recursiva que escrevi, se isso ajudar alguém. Ele copiará todos os arquivos no diretório sourced para o destinationDirectory.

exemplo:

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();
                }
            }
        }
    }
}
Yogesh Sanchihar
fonte
0

Se você não deseja usar bibliotecas externas e deseja usar as classes java.io em vez de java.nio, pode usar este método conciso para copiar uma pasta e todo o seu conteúdo:

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


    }
}
Domenico
fonte
0

A melhor maneira, de acordo com meu conhecimento, é a seguinte:

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