如何将文件从一个位置复制到另一个位置?
我想要将文件从一个位置复制到Java中的另一个位置。
这是我到目前为止:
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); } } }
这不会复制该文件,这样做的最好方法是什么?
您可以使用此 (或任何变体):
Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING);
此外,我build议使用File.separator
或/
而不是\\
使其在多个操作系统兼容,问题/答案在这里可用。
由于您不确定如何临时存储文件,请查看ArrayList
:
List<File> files = new ArrayList(); files.add(foundFile);
将文件List
移动到单个目录中:
List<File> files = ...; String path = "C:/destination/"; for(File file : files) { Files.copy(file.toPath(), (new File(path + file.getName())).toPath(), StandardCopyOption.REPLACE_EXISTING); }
使用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(); } }
使用频道
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(); } }
使用Apache Commons IO lib:
private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException { FileUtils.copyFile(source, dest); }
使用Java SE 7文件类:
private static void copyFileUsingJava7Files(File source, File dest) throws IOException { Files.copy(source.toPath(), dest.toPath()); }
性能testing:
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));
结果:
/* * 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 */
链接:
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() ); } }
在Java> = 7中使用新的Java文件类。
创build下面的方法并导入必要的库。
public static void copyFile( File from, File to ) throws IOException { Files.copy( from.toPath(), to.toPath() ); }
主要使用下面创build的方法:
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); }
注意:fileFrom是要复制到另一个文件夹中的新文件fileTo的文件。
积分 – @Scott: 用Java复制文件的标准简洁方法?