Voglio copiare un file da una posizione in un’altra posizione in Java.
Ecco cosa ho finora:
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"); Listtemp=new ArrayList(); 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); } } }
Questo non copia il file, qual è il modo migliore per farlo?
Puoi usare questo (o qualsiasi altra variante):
Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING);
Inoltre, ti consiglio di utilizzare File.separator
o /
invece di \\
per renderlo conforms su più SO, domanda / risposta su questo disponibile qui .
Dato che non sei sicuro di come memorizzare temporaneamente i file, dai un’occhiata a ArrayList
:
List files = new ArrayList(); files.add(foundFile);
Per spostare un List
di file in una singola directory:
List files = ...; String path = "C:/destination/"; for(File file : files) { Files.copy(file.toPath(), (new File(path + file.getName())).toPath(), StandardCopyOption.REPLACE_EXISTING); }
Utilizzo di 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(); } }
Utilizzando il canale
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(); } }
Usando Apache Commons IO lib:
private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException { FileUtils.copyFile(source, dest); }
Utilizzo della class File di Java SE 7:
private static void copyFileUsingJava7Files(File source, File dest) throws IOException { Files.copy(source.toPath(), dest.toPath()); }
Test della prestazione:
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));
RISULTATI:
/* * 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 */
link:
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() ); } }
Utilizzare le classi New Java File in Java> = 7.
Creare il metodo seguente e importare le librerie necessarie.
public static void copyFile( File from, File to ) throws IOException { Files.copy( from.toPath(), to.toPath() ); }
Usa il metodo creato come di seguito all’interno principale:
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 è il file che si desidera copiare in un nuovo file file in una cartella diversa.
Crediti – @Scott: modo conciso standard per copiare un file in Java?