Je souhaite copier des fichiers d'un répertoire à un autre (sous-répertoire) à l'aide de Java. J'ai un répertoire, dir, avec des fichiers texte. Je parcoure les 20 premiers fichiers du répertoire et souhaite les copier dans un autre répertoire du répertoire que j'ai créé juste avant l'itération . Dans le code, je souhaite copier le review
(qui représente le fichier texte ou révision) à trainingDir
. Comment puis-je faire ceci? Il semble ne pas y avoir une telle fonction (ou je ne pouvais pas trouver). Je vous remercie.
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];
}
Pour l'instant cela devrait résoudre votre problème
File source = new File("H:\\work-temp\\file");
File dest = new File("H:\\work-temp\\file2");
try {
FileUtils.copyDirectory(source, dest);
} catch (IOException e) {
e.printStackTrace();
}
FileUtils
class from Apache commons-io library, disponible depuis la version 1.2.
Utiliser des outils tiers au lieu d’écrire nous-mêmes tous les utilitaires semble être une meilleure idée. Cela peut économiser du temps et d’autres ressources précieuses.
Il n'y a pas (encore) de méthode de copie de fichier dans l'API standard. Vos options sont:
En Java 7, il y a is une méthode standard pour copier des fichiers en Java:
Files.copy.
Il s'intègre aux E/S natives O/S pour des performances élevées.
Voir mon A sur manière concise standard de copier un fichier en Java? pour une description complète de l'utilisation.
L'exemple ci-dessous tiré de Java Tips est plutôt simple. Depuis, je suis passé à Groovy pour les opérations relatives au système de fichiers - beaucoup plus simple et élégant. Mais voici le Java Tips un que j'ai utilisé dans le passé. Il manque la gestion des exceptions robuste nécessaire pour le rendre infaillible.
public void copyDirectory(File sourceLocation , File targetLocation)
throws IOException {
if (sourceLocation.isDirectory()) {
if (!targetLocation.exists()) {
targetLocation.mkdir();
}
String[] children = sourceLocation.list();
for (int i=0; i<children.length; i++) {
copyDirectory(new File(sourceLocation, children[i]),
new File(targetLocation, children[i]));
}
} else {
InputStream in = new FileInputStream(sourceLocation);
OutputStream out = new FileOutputStream(targetLocation);
// Copy the bits from instream to outstream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}
Si vous voulez copier un fichier sans le déplacer, vous pouvez coder comme ceci.
private static void copyFile(File sourceFile, File destFile)
throws IOException {
if (!sourceFile.exists()) {
return;
}
if (!destFile.exists()) {
destFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
if (destination != null && source != null) {
destination.transferFrom(source, 0, source.size());
}
if (source != null) {
source.close();
}
if (destination != null) {
destination.close();
}
}
Apache commons Fileutils est pratique . Vous pouvez faire ci-dessous des activités.
copier un fichier d'un répertoire à un autre.
utiliser copyFileToDirectory(File srcFile, File destDir)
copier un répertoire d’un répertoire à un autre.
utiliser copyDirectory(File srcDir, File destDir)
copier le contenu d'un fichier dans un autre
utiliser static void copyFile(File srcFile, File destFile)
Spring Framework a beaucoup de classes utilitaires similaires comme Apache Commons Lang. Donc, il y a org.springframework.util.FileSystemUtils
File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);
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();
Vous semblez chercher la solution simple (une bonne chose). Je recommande d'utiliser le fichier FileUtils.copyDirectory de Apache Common :
Copie un répertoire entier dans un nouveau fichier emplacement en préservant les dates du fichier.
Cette méthode copie le .__ spécifié. répertoire et tous ses enfants des répertoires et des fichiers vers le .__ spécifié. destination. La destination est le nouvel emplacement et nom du annuaire.
Le répertoire de destination est créé si ça n'existe pas. Si la le répertoire de destination existait, alors cette méthode fusionne le source avec le destination, avec la source prenant priorité.
Votre code pourrait aimer Nice et simple comme ceci:
File trgDir = new File("/tmp/myTarget/");
File srcDir = new File("/tmp/mySource/");
FileUtils.copyDirectory(srcDir, trgDir);
import static Java.nio.file.StandardCopyOption.*;
...
Files.copy(source, target, REPLACE_EXISTING);
Source: https://docs.Oracle.com/javase/tutorial/essential/io/copy.html
Apache commons FileUtils sera pratique, si vous voulez seulement déplacer déplacer les fichiers du répertoire source au répertoire cible plutôt que de copier le répertoire entier, vous pouvez faire:
for (File srcFile: srcDir.listFiles()) {
if (srcFile.isDirectory()) {
FileUtils.copyDirectoryToDirectory(srcFile, dstDir);
} else {
FileUtils.copyFileToDirectory(srcFile, dstDir);
}
}
Si vous voulez sauter des répertoires, vous pouvez faire:
for (File srcFile: srcDir.listFiles()) {
if (!srcFile.isDirectory()) {
FileUtils.copyFileToDirectory(srcFile, dstDir);
}
}
Ci-dessous, le code modifié de Brian, qui copie les fichiers de l'emplacement source à l'emplacement de destination.
public class CopyFiles {
public static void copyFiles(File sourceLocation , File targetLocation)
throws IOException {
if (sourceLocation.isDirectory()) {
if (!targetLocation.exists()) {
targetLocation.mkdir();
}
File[] files = sourceLocation.listFiles();
for(File file:files){
InputStream in = new FileInputStream(file);
OutputStream out = new FileOutputStream(targetLocation+"/"+file.getName());
// Copy the bits from input stream to output stream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}
}
Inspiré par la réponse de Mohit dans ce fil de discussion . Applicable uniquement pour Java 8.
Ce qui suit peut être utilisé pour tout copier de manière récursive d’un dossier à un autre:
public static void main(String[] args) throws IOException {
Path source = Paths.get("/path/to/source/dir");
Path destination = Paths.get("/path/to/dest/dir");
List<Path> sources = Files.walk(source).collect(toList());
List<Path> destinations = sources.stream()
.map(source::relativize)
.map(destination::resolve)
.collect(toList());
for (int i = 0; i < sources.size(); i++) {
Files.copy(sources.get(i), destinations.get(i));
}
}
FTW de style flux.
Vous pouvez contourner le problème en copiant le fichier source dans un nouveau fichier et en supprimant le fichier 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();
}
}
}
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))));
Méthode de copie
static void copy(Path source, Path dest) {
try {
Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
Utilisation
org.Apache.commons.io.FileUtils
C'est tellement pratique
Copier le fichier d'un répertoire à un autre ...
FileChannel source=new FileInputStream(new File("source file path")).getChannel();
FileChannel desti=new FileOutputStream(new File("destination file path")).getChannel();
desti.transferFrom(source, 0, source.size());
source.close();
desti.close();
il s’agit simplement d’un code Java permettant de copier des données d’un dossier à un autre, il suffit de donner l’entrée de la source et de la destination.
import Java.io.*;
public class CopyData {
static String source;
static String des;
static void dr(File fl,boolean first) throws IOException
{
if(fl.isDirectory())
{
createDir(fl.getPath(),first);
File flist[]=fl.listFiles();
for(int i=0;i<flist.length;i++)
{
if(flist[i].isDirectory())
{
dr(flist[i],false);
}
else
{
copyData(flist[i].getPath());
}
}
}
else
{
copyData(fl.getPath());
}
}
private static void copyData(String name) throws IOException {
int i;
String str=des;
for(i=source.length();i<name.length();i++)
{
str=str+name.charAt(i);
}
System.out.println(str);
FileInputStream fis=new FileInputStream(name);
FileOutputStream fos=new FileOutputStream(str);
byte[] buffer = new byte[1024];
int noOfBytes = 0;
while ((noOfBytes = fis.read(buffer)) != -1) {
fos.write(buffer, 0, noOfBytes);
}
}
private static void createDir(String name, boolean first) {
int i;
if(first==true)
{
for(i=name.length()-1;i>0;i--)
{
if(name.charAt(i)==92)
{
break;
}
}
for(;i<name.length();i++)
{
des=des+name.charAt(i);
}
}
else
{
String str=des;
for(i=source.length();i<name.length();i++)
{
str=str+name.charAt(i);
}
(new File(str)).mkdirs();
}
}
public static void main(String args[]) throws IOException
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("program to copy data from source to destination \n");
System.out.print("enter source path : ");
source=br.readLine();
System.out.print("enter destination path : ");
des=br.readLine();
long startTime = System.currentTimeMillis();
dr(new File(source),true);
long endTime = System.currentTimeMillis();
long time=endTime-startTime;
System.out.println("\n\n Time taken = "+time+" mili sec");
}
}
cela un code de travail pour ce que vous voulez..laissez-moi savoir si cela a aidé
Les classes NIO rendent cela très simple.
j'utilise le code suivant pour transférer une CommonMultipartFile
téléchargée dans un dossier et copier ce fichier dans un dossier de destination du dossier de projet Web webapps (i.e)
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);
Le meilleur moyen selon mes connaissances est le suivant:
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) {
}
}
}
Si vous ne souhaitez pas utiliser de bibliothèques externes et que vous souhaitez utiliser les classes Java.io à la place des classes Java.nio, vous pouvez utiliser cette méthode concise pour copier un dossier et tout son contenu:
/**
* 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();
}
}
}
Vous pouvez utiliser le code suivant pour copier des fichiers d’un répertoire à un autre.
public static void copyFile(File sourceFile, File destFile) throws IOException {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(sourceFile);
out = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
} catch(Exception e){
e.printStackTrace();
}
finally {
in.close();
out.close();
}
}
code suivant pour copier des fichiers d'un répertoire à un autre
File destFile = new File(targetDir.getAbsolutePath() + File.separator
+ file.getName());
try {
showMessage("Copying " + file.getName());
in = new BufferedInputStream(new FileInputStream(file));
out = new BufferedOutputStream(new FileOutputStream(destFile));
int n;
while ((n = in.read()) != -1) {
out.write(n);
}
showMessage("Copied " + file.getName());
} catch (Exception e) {
showMessage("Cannot copy file " + file.getAbsolutePath());
} finally {
if (in != null)
try {
in.close();
} catch (Exception e) {
}
if (out != null)
try {
out.close();
} catch (Exception e) {
}
}
Vous pouvez utiliser le code suivant pour copier des fichiers d’un répertoire à un autre.
// parent folders of dest must exist before calling this function
public static void copyTo( File src, File dest ) throws IOException {
// recursively copy all the files of src folder if src is a directory
if( src.isDirectory() ) {
// creating parent folders where source files is to be copied
dest.mkdirs();
for( File sourceChild : src.listFiles() ) {
File destChild = new File( dest, sourceChild.getName() );
copyTo( sourceChild, destChild );
}
}
// copy the source file
else {
InputStream in = new FileInputStream( src );
OutputStream out = new FileOutputStream( dest );
writeThrough( in, out );
in.close();
out.close();
}
}
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();
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");
}
}