Java IO編程——文件拷貝

在操做系統裏面有一個copy命令,這個命令的主要功能是能夠實現文件的拷貝處理,如今要求模擬這個命令,經過初始化參數輸入拷貝的源文件路徑與拷貝的目標路徑實現文件的拷貝處理。java

需求分析:

   ·須要實現文件的拷貝操做,那麼這種拷貝就有可能拷貝各類類型的文件,因此確定使用字節流;數組

   ·在進行拷貝的時候有可能須要考慮到大文件的拷貝問題;ide

實現方案:

   ·方案一:使用InputStream將所有要拷貝的內容直接讀取到程序裏面,然後一次性的輸出到目標文件;工具

  |- 若是如今拷貝的文件很大,基本上程序就死了;this

   ·方案二:採用部分拷貝,讀取一部分輸出一部分數據,若是如今要採用第二種作法,核心的操做方法:spa

      |- InputStream:public int read​(byte[] b) throws IOException;操作系統

      |- OutputStream:public void write​(byte[] b,int off, int len) throws IOException;code

範例:實現文件拷貝處理orm

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileOutputStream;
 4 import java.io.InputStream;
 5 import java.io.OutputStream;
 6 class FileUtil {    // 定義一個文件操做的工具類
 7     private File srcFile ; // 源文件路徑
 8     private File desFile ; // 目標文件路徑
 9     public FileUtil(String src,String des) {
10         this(new File(src),new File(des)) ;
11     }
12     public FileUtil(File srcFile,File desFile) {
13         this.srcFile = srcFile ;
14         this.desFile = desFile ;
15     }
16     public boolean copy() throws Exception {    // 文件拷貝處理
17         if (!this.srcFile.exists()) {    // 源文件必須存在!
18             System.out.println("拷貝的源文件不存在!");
19             return false ; // 拷貝失敗
20         }
21         if (!this.desFile.getParentFile().exists()) { 
22             this.desFile.getParentFile().mkdirs() ; // 建立父目錄
23         }
24         byte data [] = new byte[1024] ; // 開闢一個拷貝的緩衝區
25         InputStream input = null ;
26         OutputStream output = null ;
27         try {
28             input = new FileInputStream(this.srcFile) ;
29             output = new FileOutputStream(this.desFile) ;
30             int len = 0 ;
31             // 一、讀取數據到數組之中,隨後返回讀取的個數、len = input.read(data
32             // 二、判斷個數是不是-1,若是不是則進行寫入、(len = input.read(data)) != -1
33             while ((len = input.read(data)) != -1) {
34                 output.write(data, 0, len);
35             }
36             return true ; 
37         } catch (Exception e) {
38             throw e ;
39         } finally {
40             if (input != null) {
41                 input.close();    
42             } 
43             if (output != null) {
44                 output.close() ;
45             }
46         }
47     }
48 }
49 public class JavaAPIDemo {
50     public static void main(String[] args) throws Exception {
51         if (args.length != 2) {    // 程序執行出錯
52             System.out.println("命令執行錯誤,執行結構:java JavaAPIDemo 拷貝源文件路徑 拷貝目標文件路徑");
53             System.exit(1); 
54         }
55         long start = System.currentTimeMillis() ;
56         FileUtil fu = new FileUtil(args[0],args[1]) ;
57         System.out.println(fu.copy() ? "文件拷貝成功!" : "文件拷貝失敗!");
58         long end = System.currentTimeMillis() ;
59         System.out.println("拷貝完成的時間:" + (end - start));
60     }
61 }
JavaAPIDemo

  

  

    可是須要注意的是,以上的作法是屬於文件拷貝的最原始的實現,而從JDK1.9開始InputStream和Reader類中都追加有數據轉存的處理操做方法:blog

      ·InputStream:public long transferTo​(OutputStream out) throws IOException;

      ·Reader:public long transferTo​(Writer out) throws IOException;

範例:使用轉存的方式處理

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileOutputStream;
 4 import java.io.InputStream;
 5 import java.io.OutputStream;
 6 class FileUtil {    // 定義一個文件操做的工具類
 7     private File srcFile ; // 源文件路徑
 8     private File desFile ; // 目標文件路徑
 9     public FileUtil(String src,String des) {
10         this(new File(src),new File(des)) ;
11     }
12     public FileUtil(File srcFile,File desFile) {
13         this.srcFile = srcFile ;
14         this.desFile = desFile ;
15     }
16     public boolean copy() throws Exception {    // 文件拷貝處理
17         if (!this.srcFile.exists()) {    // 源文件必須存在!
18             System.out.println("拷貝的源文件不存在!");
19             return false ; // 拷貝失敗
20         }
21         if (!this.desFile.getParentFile().exists()) { 
22             this.desFile.getParentFile().mkdirs() ; // 建立父目錄
23         }
24         InputStream input = null ;
25         OutputStream output = null ;
26         try {
27             input = new FileInputStream(this.srcFile) ;
28             output = new FileOutputStream(this.desFile) ;
29             input.transferTo(output) ;
30             return true ; 
31         } catch (Exception e) {
32             throw e ;
33         } finally {
34             if (input != null) {
35                 input.close();    
36             } 
37             if (output != null) {
38                 output.close() ;
39             }
40         }
41     }
42 }
43 public class JavaAPIDemo {
44     public static void main(String[] args) throws Exception {
45         if (args.length != 2) {    // 程序執行出錯
46             System.out.println("命令執行錯誤,執行結構:java JavaAPIDemo 拷貝源文件路徑 拷貝目標文件路徑");
47             System.exit(1); 
48         }
49         long start = System.currentTimeMillis() ;
50         FileUtil fu = new FileUtil(args[0],args[1]) ;
51         System.out.println(fu.copy() ? "文件拷貝成功!" : "文件拷貝失敗!");
52         long end = System.currentTimeMillis() ;
53         System.out.println("拷貝完成的時間:" + (end - start));
54     }
55 }
JavaAPIDemo

  此時千萬要注意程序的運行版本問題。若是說如今對此程序要求進一步擴展,能夠實現一個文件目錄的拷貝呢?一旦進行了文件目錄的拷貝還須要拷貝全部的子目錄中的文件。


 

範例:文件夾拷貝

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileOutputStream;
 4 import java.io.InputStream;
 5 import java.io.OutputStream;
 6 class FileUtil {    // 定義一個文件操做的工具類
 7     private File srcFile ; // 源文件路徑
 8     private File desFile ; // 目標文件路徑
 9     public FileUtil(String src,String des) {
10         this(new File(src),new File(des)) ;
11     }
12     public FileUtil(File srcFile,File desFile) {
13         this.srcFile = srcFile ;
14         this.desFile = desFile ;
15     }
16     public boolean copyDir() throws Exception {
17         try {
18             this.copyImpl(this.srcFile) ;
19             return true ;
20         } catch (Exception e) {
21             return false ; 
22         }
23     }
24     private void copyImpl(File file) throws Exception {    // 遞歸操做
25         if (file.isDirectory()) {    // 是目錄
26             File results [] = file.listFiles() ; // 列出所有目錄組成
27             if (results != null) {
28                 for (int x = 0 ; x < results.length ; x ++) {
29                     copyImpl(results[x]) ;
30                 }
31             }
32         } else {    // 是文件
33             String newFilePath = file.getPath().replace(this.srcFile.getPath() + File.separator, "") ;
34             File newFile = new File(this.desFile,newFilePath) ; // 拷貝的目標路徑
35             this.copyFileImpl(file, newFile) ;
36         }
37     }
38     private boolean copyFileImpl(File srcFile,File desFile) throws Exception {
39         if (!desFile.getParentFile().exists()) { 
40             desFile.getParentFile().mkdirs() ; // 建立父目錄
41         }
42         InputStream input = null ;
43         OutputStream output = null ;
44         try {
45             input = new FileInputStream(srcFile) ;
46             output = new FileOutputStream(desFile) ;
47             input.transferTo(output) ;
48             return true ;
49         } catch (Exception e) {
50             throw e ;
51         } finally {
52             if (input != null) {
53                 input.close();    
54             } 
55             if (output != null) {
56                 output.close() ;
57             }
58         }
59     }
60     
61     public boolean copy() throws Exception {    // 文件拷貝處理
62         if (!this.srcFile.exists()) {    // 源文件必須存在!
63             System.out.println("拷貝的源文件不存在!");
64             return false ; // 拷貝失敗
65         }
66         return this.copyFileImpl(this.srcFile, this.desFile) ;
67     }
68 }
69 public class JavaAPIDemo {
70     public static void main(String[] args) throws Exception {
71         if (args.length != 2) {    // 程序執行出錯
72             System.out.println("命令執行錯誤,執行結構:java JavaAPIDemo 拷貝源文件路徑 拷貝目標文件路徑");
73             System.exit(1); 
74         }
75         long start = System.currentTimeMillis() ;
76         FileUtil fu = new FileUtil(args[0],args[1]) ;
77         if (new File(args[0]).isFile()) {    // 文件拷貝
78             System.out.println(fu.copy() ? "文件拷貝成功!" : "文件拷貝失敗!");
79         } else {    // 目錄拷貝
80             System.out.println(fu.copyDir() ? "文件拷貝成功!" : "文件拷貝失敗!");
81         }
82         long end = System.currentTimeMillis() ;
83         System.out.println("拷貝完成的時間:" + (end - start));
84     }
85 }
JavaAPIDemo
本程序是IO操做的核心代碼,本程序能夠理解整個的IO處理機制就很是容易理解了。
相關文章
相關標籤/搜索