IO流的文件復制


1、IO流的分類

 

1.根據處理數據類型的不同分為:
   字符流:1)Reader  讀取字符流的抽象類   
      常用方法: read() 讀取單個字符
                   read(char[] cbuf) 將字符讀入數組。
            read(char[] cbuf, int off, int len) 將字符讀入數組的某一部分。
            close() 關閉該流並釋放與之關聯的所有資源。
      2)Writer  寫入字符流的抽象類 
      常用方法:write(int c) 寫入單個字符。  
           write(String str) 寫入字符串
           write(String str, int off, int len) 寫入字符串的某一部分。
           write(char[] cbuf) 寫入字符數組。
           write(char[] cbuf, int off, int len) 寫入字符數組的某一部分。
           flush() 刷新該流的緩沖。
           close() 關閉此流,但要先刷新它。
   字節流:
      1)InputStream    此抽象類是表示字節輸入流的所有類的超類
       常用方法:read() 從輸入流中讀取數據的下一個字節。
            read(byte[] b) 從輸入流中讀取一定數量的字節,並將其存儲在緩沖區數組 b 中。
            read(byte[] b, int off, int len) 將輸入流中最多 len 個數據字節讀入 byte 數組。
            close() 關閉此輸入流並釋放與該流關聯的所有系統資源。
      2) OutputStream   此抽象類是表示字節輸出流的所有類的超類
       常用方法:write(int b) 將指定的字節寫入此輸出流。
            write(byte[] b) 將 b.length 個字節從指定的 byte 數組寫入此輸出流。
            write(byte[] b, int off, int len) 將指定 byte 數組中從偏移量 off 開始的 
            flush() 刷新此輸出流並強制寫出所有緩沖的輸出字節。
            close() 關閉此輸出流並釋放與此流有關的所有系統資源。
2.根據數據流向不同分為:輸入流和輸出流
3.字符流的由來: 因為數據編碼的不同,而有了對字符進行高效操作的流對象。本質其實就是基於字節流讀取時,去查了指定的碼表。
4.字節流和字符流的區別:
 (1)讀寫單位不同:字節流以字節(8bit)為單位,字符流以字符為單位,根據碼表映射字符,一次可能讀多個字節。
 (2)處理對象不同:字節流能處理所有類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。
 (3)字節流在操作的時候本身是不會用到緩沖區的,是文件本身的直接操作的;而字符流在操作的時候下后是會用到緩沖區的,是通過緩沖區來操作文件,我們將在下面驗證這一點。
5.結論:優先選用字節流。首先因為硬盤上的所有文件都是以字節的形式進行傳輸或者保存的,包括圖片等內容。但是字符只是在內存中才會形成的,所以在開發中,字節流使用廣泛。
6.輸入流和輸出流
   對輸入流只能進行讀操作,對輸出流只能進行寫操作,程序中需要根據待傳輸數據的不同特性而使用不同的流。

 

2、IO流的結構圖

3、字節流復制文件

 1 package FileInputStream;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 
 7 // 字節流復制文件
 8 public class Copy字節流復制文件 {
 9     public static void main(String[] args) {
10         // 復制文件的起始時間
11         long s = System.currentTimeMillis();
12         // 定義輸入\輸出流為mull
13         FileInputStream fis = null;
14         FileOutputStream fos = null;
15         // 手動拋出異常
16         try {
17             // 讀取文件
18             fis = new FileInputStream("d:\\digui.mp4");
19             // 讀取完畢復制的文件
20             fos = new FileOutputStream("d:\\dd.mp4");
21             // 定義一個字節數組  存到數組b中
22             byte[] b = new byte[1024 * 10];
23             // 起始長度為0
24             int len = 0;
25             // while(){} 循環   一邊讀取 ,一邊寫入(復制)文件
26             while ((len = fis.read(b)) != -1) {
27                 fos.write(b, 0, len);
28                 fos.flush();  //  文件刷新
29             }
30         } catch (Exception e) {
31             System.out.println(e);
32             throw new RuntimeException("文件復制失敗");  // 手動拋除異常
33             // 最終執行語句
34         } finally {
35             // 復制的文件不為空時  關閉釋放資源
36             if (fos != null) {
37                 try {
38                     fos.close();
39                 } catch (IOException e) {
40                     e.printStackTrace();
41                 } finally {
42                     if (fis != null) {
43                         try {
44                             fis.close();
45                         } catch (IOException e) {
46                             System.out.println(e);
47                             throw new RuntimeException("文件復制失敗");
48                         }
49                     }
50                 }
51             }
52         }
53         // 復制文件的結束時間   單位:ms 毫秒
54         long e = System.currentTimeMillis();
55         System.out.println(e-s);
56     }
57 }

4、字符流復制文件

 1 package Demo;
 2 
 3 import java.io.FileReader;
 4 import java.io.FileWriter;
 5 import java.io.IOException;
 6 //字符流復制文件     FileReader   read讀取
 7 //                   FileWriter   write寫入
 8 public class Copy字符流復制文件 {
 9     public static void main(String[] args) {
10         long s = System.currentTimeMillis();
11         FileReader fr = null;   // 字符輸入流
12         FileWriter fw = null;   // 字符輸出流
13         try {
14             fr = new FileReader("d:\\b.txt");
15             fw = new FileWriter("d:\\b22.txt");
16             char[] c = new char[1024];  //  字符類char
17             int len = 0;
18             while((len=fr.read(c))!=-1){
19                 fw.write(c,0,len);
20                 fw.flush();
21             }
22         } catch (Exception e) {
23             e.printStackTrace();
24         }finally{
25             if(fw!=null){
26                 try {
27                     fw.close();
28                 } catch (IOException e) {
29                     e.printStackTrace();
30                 }finally{
31                     if(fr!=null){
32                         try {
33                             fr.close();
34                         } catch (IOException e) {
35                             e.printStackTrace();
36                         }
37                     }
38                 }
39             }
40         }
41         long e = System.currentTimeMillis();
42         System.out.println(e-s);
43     }
44 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM