天天看點

用FileChannel拷貝檔案

 用filechannel更友善一些

/**  

Copy files, using two techniques, FileChannels and streams. 

Using FileChannels is usually faster than using streams. 

*/ 

public final class CopyFiles { 

 /* Change these settings before running this class. */ 

 /** The file to be copied. */ 

 public static final String INPUT_FILE = "C:\\TEMP\\cottage.jpg"; 

 /** 

  The name of the copy to be created by this class.   

  If this file doesn't exist, it will be created, along with any  

  needed parent directories.   

 */ 

 public static final String COPY_FILE_TO = "C:\\TEMP10\\cottage_2.jpg"; 

 /** Run the example. */ 

 public static void main(String... aArgs) throws IOException{ 

   File source = new File(INPUT_FILE); 

   File target = new File(COPY_FILE_TO); 

   CopyFiles test = new CopyFiles(); 

   test.copyWithChannels(source, target, false); 

   //test.copyWithStreams(source, target, false); 

   log("Done."); 

 } 

 /** This may fail for VERY large files. */ 

 private void copyWithChannels(File aSourceFile, File aTargetFile, boolean aAppend) { 

   log("Copying files with channels."); 

   ensureTargetDirectoryExists(aTargetFile.getParentFile()); 

   FileChannel inChannel = null; 

   FileChannel outChannel = null; 

   FileInputStream inStream = null; 

   FileOutputStream outStream = null; 

   try{ 

     try { 

       inStream = new FileInputStream(aSourceFile); 

       inChannel = inStream.getChannel(); 

       outStream = new  FileOutputStream(aTargetFile, aAppend);         

       outChannel = outStream.getChannel(); 

       long bytesTransferred = 0; 

       //defensive loop - there's usually only a single iteration : 

       while(bytesTransferred < inChannel.size()){ 

         bytesTransferred += inChannel.transferTo(0, inChannel.size(), outChannel); 

       } 

     } 

     finally { 

       //being defensive about closing all channels and streams  

       if (inChannel != null) inChannel.close(); 

       if (outChannel != null) outChannel.close(); 

       if (inStream != null) inStream.close(); 

       if (outStream != null) outStream.close(); 

   } 

   catch (FileNotFoundException ex){ 

     log("File not found: " + ex); 

   catch (IOException ex){ 

     log(ex); 

 private void copyWithStreams(File aSourceFile, File aTargetFile, boolean aAppend) { 

   log("Copying files with streams."); 

   InputStream inStream = null; 

   OutputStream outStream = null; 

       byte[] bucket = new byte[32*1024]; 

       inStream = new BufferedInputStream(new FileInputStream(aSourceFile)); 

       outStream = new BufferedOutputStream(new FileOutputStream(aTargetFile, aAppend)); 

       int bytesRead = 0; 

       while(bytesRead != -1){ 

         bytesRead = inStream.read(bucket); //-1, 0, or more 

         if(bytesRead > 0){ 

           outStream.write(bucket, 0, bytesRead); 

         } 

 private void ensureTargetDirectoryExists(File aTargetDir){ 

   if(!aTargetDir.exists()){ 

     aTargetDir.mkdirs(); 

 private static void log(Object aThing){ 

   System.out.println(String.valueOf(aThing)); 

}  

本文轉自sucre03 51CTO部落格,原文連結:http://blog.51cto.com/sucre/652052,如需轉載請自行聯系原作者

繼續閱讀