Copiando arquivos de um diretório para outro em Java

Eu quero copiar arquivos de um diretório para outro (subdiretório) usando Java. Eu tenho um diretório, dir, com arquivos de texto. I iterar sobre os primeiros 20 arquivos em dir, e quero copiá-los para outro diretório no diretório dir, que eu criei antes da iteração. No código, quero copiar a review (que representa o arquivo de texto ou revisão) para trainingDir . Como posso fazer isso? Parece não haver tal function (ou 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]; } 

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

Classe FileUtils 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 nós mesmos parece ser uma ideia melhor. Pode economizar tempo e outros resources valiosos.

Não há um método de cópia de arquivo na API Standard (ainda). 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 o NIO2 no Java 7

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

Files.copy.

Integra-se com E / S nativa O / S para alto desempenho.

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

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. Ele não possui o tratamento robusto de exceções necessário para torná-lo à prova de falhas.

  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 0) { out.write(buf, 0, len); } in.close(); out.close(); } } 

Se você quiser copiar um arquivo e não movê-lo, você pode codificar assim.

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

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

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

    use copyFileToDirectory(File srcFile, File destDir)

  2. copiando o diretório de um diretório para outro diretório.

    use copyDirectory(File srcDir, File destDir)

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

    use static void copyFile(File srcFile, File destFile)

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 tendo precedência.

Seu código pode ser legal e simples assim:

 File trgDir = new File("/tmp/myTarget/"); File srcDir = new File("/tmp/mySource/"); FileUtils.copyDirectory(srcDir, trgDir); 
 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(); 

O Spring Framework tem muitas classs utilitárias semelhantes, como o Apache Commons Lang. Portanto, há org.springframework.util.FileSystemUtils

 File src = new File("/home/user/src"); File dest = new File("/home/user/dest"); FileSystemUtils.copyRecursively(src, dest); 
 import static java.nio.file.StandardCopyOption.*; ... Files.copy(source, target, REPLACE_EXISTING); 

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

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

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

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

Se você quiser pular diretórios, você pode fazer:

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

Você pode contornar 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(); } } } 

Inspirado pela resposta de Mohit neste tópico . Aplicável apenas para o 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 sources = Files.walk(source).collect(toList()); List 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 estilo Stream.

Usar

org.apache.commons.io.FileUtils

É tão prático

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

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

Copiar Método

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

As classs NIO tornam isso muito simples.

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

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

aqui é simplesmente um código java para copiar dados de uma pasta para outra, basta dar a input 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;i0;i--) { if(name.charAt(i)==92) { break; } } for(;i 

este um código de trabalho para o que você quer .. me diga se ele ajudou

Eu uso o seguinte código para transferir um CommonMultipartFile carregado para uma pasta e copie esse arquivo para uma pasta de destino em webapps (ie) pasta de 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); 

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

seguinte código 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) { } } 
 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"); } } 

Nem mesmo isso complicado e nenhuma importação necessária no Java 7:

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

public boolean renameTo( File destination)

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

 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). Java I / O (pág. 393). O’Reilly Media. Edição Kindle.

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

Após a function recursiva eu ​​escrevi, se isso ajuda alguém. Ele irá copiar todos os arquivos dentro do sourcedirectory para 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(); } } } } } 

você usa renameTo () – não é óbvio, eu sei … mas é o equivalente em Java de mover …