package nodstream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class TestFileCopy {
/**
* 測試文件拷貝
*
* \轉義字符 :使得緊跟在它之后的字符就按本意處理,不做任何特殊用途
*/
public static void main(String[] args) throws Exception{
//讀取源文件的輸入流
FileInputStream fis = new FileInputStream("f:\\corejava\\1.png");
//寫備份文件的輸出流
FileOutputStream fos = new FileOutputStream("copy1.png");
//邊讀邊寫
byte[] b = new byte[100];
while(true){
int n = fis.read(b);
if(n==-1) break;
fos.write(b,0,n); // 防著最后一次讀到的數據(不一定完全裝滿數組b)
}
fis.close();
fos.close();
}
}
IO流
一.流
概念:是對象,用來在內存和外部的存儲設備之間交換數據的通道。
分類
1)方向: 輸入流 輸出流 【判定標準,以當前程序為參照物】
2)單位:
字節流 -- 以字節為單位傳遞數據 , 可以傳遞任意類型的數據
字符流 -- 以字符為單位傳遞數據 , 只可以讀寫文本文件
3)功能:
節點流 -- 實際負責數據傳遞的流對象
過濾流 -- 負責為其他流對象添加輔助功能的流對象
二.字節流
字節流父類:OutputStream(字節輸出流) | InputStream(字節輸入流)
-
字節節點流 【重點】
1)FileOutputStream : 文件字節輸出流2)FileInputStream :文件字節輸入流
- 字節過濾流
1)DataInputStream | DataOutputStream
I. 提供了直接讀寫8種基本數據類型的功能
II. 提供了直接讀寫String的方法(writeUTF readUTF )
- BufferedInputStream | BufferedOutputStream
I. 提供了緩存功能的字節過濾流,以空間換時間,減少訪問硬盤的次數,提高數據
傳輸速度。緩存功能對于輸入流效果不明顯
II. 緩沖器輸出:
A. 關閉流時,會自動flush
B. 數據將緩沖區填滿,會自動flush
C. 手動輸出: 需要調用流對象的flush()
3)ObjectInputStream | ObjectOutputStream
I. 提供了直接讀寫對象 以及 8種基本數據類型數據 的功能
提供了緩沖功能 --- 可以用它替換上面兩種過濾流
II. 對象只有能夠序列化,才能放在流里傳遞
實現類Serializable接口的對象,就是可序列化的對象
注意:Serializable接口是一個“標記接口”
III. 不需要參與序列化的屬性,可以用關鍵字transient修飾
IV. 對象以及對象的所有屬性都必須是可序列化的,才能通過流傳遞
V. 讀取對象的輸入流以拋出EOFException的形式提示用戶文件讀取完畢
4)PrintStream --- System.out
三.字符編碼
- ASCII編碼 --- 美國
- GB2312 --- 中國,國標
- GBK ---- 國標的擴展
- BIG5 ---- 中文繁體,臺灣
- ISO8859_1 --- 西歐,希臘,阿拉伯,泰語,希伯來
- UTF-8 ---- 國際統一編碼,是可變長的unicode
注意:如果編解碼方式不統一,則可能導致亂碼
四.字符流
父類 : Reader | Writer
-
節點流:
FileWriter- write(int c) --- 向流里寫一個字符
2)write( char[] c) --- 向流里寫一個字符數組
3)write(String str) --- 向流里寫一個String
FileReader
1)read() --- 讀取一個字符,返回字符的int形式,-1結束
2)read(char[] c) ---一次讀取多個字符,存入數組返回,返回值為讀到的個數,
-1結束
- write(int c) --- 向流里寫一個字符
-
過濾流
BufferdReader | PrintWriter --- 帶緩沖功能的字符流
1)PrintWriter提供了大量的println方法,輸出方便
2)BufferedReader 提供了readLine(),一次讀取一行文字,直到讀到行結束符為止。
這是一個阻塞方法。InputStreamReader | OutputStreamWriter ---- “橋轉換器”
1)負責將一個字節流轉換成字符流
2)可以在構建過程中,指定編碼方式(唯一一個可以指定編碼的流)
通常和FileInputStream配合,用來讀取指定了編碼的文本文件
五.流總結
流程序的編程步驟:
1. 創建節點流對象 (優選FileInputStream,FileOutputStream)
2. 封裝過濾流 (優選“橋轉換器”,帶緩沖的字符過濾流)
3. 讀寫數據 ( println 和 readLine )
4. 關閉流對象
六.File類 (輔助類)
- 概念:一個File類的對象代表了文件系統里的一個文件或者目錄,使用File類不能改變文件內容,只能設置一些屬性。