Je souhaite copier un fichier d'un emplacement à un autre en Java.
Voici ce que j'ai jusqu'à présent:
import Java.io.File;
import Java.io.FilenameFilter;
import Java.util.ArrayList;
import Java.util.List;
public class TestArrayList {
public static void main(String[] args) {
File f = new File(
"D:\\CBSE_Demo\\Demo_original\\fscommand\\contentplayer\\config");
List<String>temp=new ArrayList<String>();
temp.add(0, "N33");
temp.add(1, "N1417");
temp.add(2, "N331");
File[] matchingFiles = null;
for(final String temp1: temp){
matchingFiles = f.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.startsWith(temp1);
}
});
System.out.println("size>>--"+matchingFiles.length);
}
}
}
Cela ne copie pas le fichier, quel est le meilleur moyen de le faire?
Vous pouvez utiliser this (ou toute variante):
Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING);
De plus, je vous recommanderais d'utiliser File.separator
ou /
au lieu de \\
pour le rendre compatible sur plusieurs systèmes d'exploitation. Question/réponse sur ce disponible ici .
Puisque vous ne savez pas comment stocker temporairement des fichiers, jetez un coup d'œil à ArrayList
:
List<File> files = new ArrayList();
files.add(foundFile);
Pour déplacer une List
de fichiers dans un seul répertoire:
List<File> files = ...;
String path = "C:/destination/";
for(File file : files) {
Files.copy(file.toPath(),
(new File(path + file.getName())).toPath(),
StandardCopyOption.REPLACE_EXISTING);
}
Utilisation de Stream
private static void copyFileUsingStream(File source, File dest) throws IOException {
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);
}
} finally {
is.close();
os.close();
}
}
Utiliser un canal
private static void copyFileUsingChannel(File source, File dest) throws IOException {
FileChannel sourceChannel = null;
FileChannel destChannel = null;
try {
sourceChannel = new FileInputStream(source).getChannel();
destChannel = new FileOutputStream(dest).getChannel();
destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
}finally{
sourceChannel.close();
destChannel.close();
}
}
Utilisation d'Apache Commons IO lib:
private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
FileUtils.copyFile(source, dest);
}
Utilisation de Java SE 7 Files class:
private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
Files.copy(source.toPath(), dest.toPath());
}
Test de performance:
File source = new File("/Users/pankaj/tmp/source.avi");
File dest = new File("/Users/pankaj/tmp/dest.avi");
//copy file conventional way using Stream
long start = System.nanoTime();
copyFileUsingStream(source, dest);
System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start));
//copy files using Java.nio FileChannel
source = new File("/Users/pankaj/tmp/sourceChannel.avi");
dest = new File("/Users/pankaj/tmp/destChannel.avi");
start = System.nanoTime();
copyFileUsingChannel(source, dest);
System.out.println("Time taken by Channel Copy = "+(System.nanoTime()-start));
//copy files using Apache commons io
source = new File("/Users/pankaj/tmp/sourceApache.avi");
dest = new File("/Users/pankaj/tmp/destApache.avi");
start = System.nanoTime();
copyFileUsingApacheCommonsIO(source, dest);
System.out.println("Time taken by Apache Commons IO Copy = "+(System.nanoTime()-start));
//using Java 7 Files class
source = new File("/Users/pankaj/tmp/sourceJava7.avi");
dest = new File("/Users/pankaj/tmp/destJava7.avi");
start = System.nanoTime();
copyFileUsingJava7Files(source, dest);
System.out.println("Time taken by Java7 Files Copy = "+(System.nanoTime()-start));
RÉSULTATS:
/*
* File copy:
* Time taken by Stream Copy = 44582575000
* Time taken by Channel Copy = 104138195000
* Time taken by Apache Commons IO Copy = 108396714000
* Time taken by Java7 Files Copy = 89061578000
*/
Lien:
Utilisez les classes New Java File dans Java> = 7.
Créez la méthode ci-dessous et importez les bibliothèques nécessaires.
public static void copyFile( File from, File to ) throws IOException {
Files.copy( from.toPath(), to.toPath() );
}
Utilisez la méthode créée comme ci-dessous dans main:
File dirFrom = new File(fileFrom);
File dirTo = new File(fileTo);
try {
copyFile(dirFrom, dirTo);
} catch (IOException ex) {
Logger.getLogger(TestJava8.class.getName()).log(Level.SEVERE, null, ex);
}
NB: - fileFrom est le fichier que vous voulez copier dans un nouveau fichier fileTo dans un dossier différent.
Credits - @Scott: Une manière concise standard de copier un fichier en Java?
public static void copyFile(File oldLocation, File newLocation) throws IOException {
if ( oldLocation.exists( )) {
BufferedInputStream reader = new BufferedInputStream( new FileInputStream(oldLocation) );
BufferedOutputStream writer = new BufferedOutputStream( new FileOutputStream(newLocation, false));
try {
byte[] buff = new byte[8192];
int numChars;
while ( (numChars = reader.read( buff, 0, buff.length ) ) != -1) {
writer.write( buff, 0, numChars );
}
} catch( IOException ex ) {
throw new IOException("IOException when transferring " + oldLocation.getPath() + " to " + newLocation.getPath());
} finally {
try {
if ( reader != null ){
writer.close();
reader.close();
}
} catch( IOException ex ){
Log.e(TAG, "Error closing files when transferring " + oldLocation.getPath() + " to " + newLocation.getPath() );
}
}
} else {
throw new IOException("Old location does not exist when transferring " + oldLocation.getPath() + " to " + newLocation.getPath() );
}
}
Files.exists ()
Files.createDirectory ()
Fichiers.copie ()
Remplacement de fichiers existants: Files.move ()
Fichiers.delete ()
Files.walkFileTree () entrez la description du lien ici
Copier un fichier d'un emplacement à un autre signifie que vous devez copier l'intégralité du contenu vers un autre emplacement .Files.copy(Path source, Path target, CopyOption... options) throws IOException
cette méthode attend l'emplacement source qui est l'emplacement du fichier d'origine et l'emplacement cible qui est un nouvel emplacement de dossier avec le même type de fichier de destination . Chaque emplacement cible doit exister dans notre système, sinon nous devons créer un emplacement de dossier, puis créer un fichier portant le même nom que le nom de fichier d'origine. Ensuite, en utilisant la fonction de copie, nous pouvons facilement copier un fichier. fichier d'un endroit à l'autre.
public static void main(String[] args) throws IOException {
String destFolderPath = "D:/TestFile/abc";
String fileName = "pqr.xlsx";
String sourceFilePath= "D:/TestFile/xyz.xlsx";
File f = new File(destFolderPath);
if(f.mkdir()){
System.out.println("Directory created!!!!");
}
else {
System.out.println("Directory Exists!!!!");
}
f= new File(destFolderPath,fileName);
if(f.createNewFile()) {
System.out.println("File Created!!!!");
} else {
System.out.println("File exists!!!!");
}
Files.copy(Paths.get(sourceFilePath), Paths.get(destFolderPath, fileName),REPLACE_EXISTING);
System.out.println("Copy done!!!!!!!!!!!!!!");
}