Java IO 字節流與字符流 (二)
概述
IO流用來處理設備之間的數據傳輸
Java對數據的操作時通過流的方式
Java用於操作流的對象都在IO包中
流按操作的數據分為:字節流和字符流
流按流向不同分為:輸入流和輸出流
IO流常用基類
字節流的抽象基類
InputStream,OuputStream
字符流的抽象基類
Reader,Writer
註:
這些基類的子類都是以基類的名稱結尾的,如FileReader,FileInputStream
字節流
字節流:以字符為導向的流
簡單介紹一個例子,演示字節流對圖片的復制
1: import java.io.*;
2:
3: class IOCopyPicDemo
4: {
5: public static void main(String[] args) throws IOException
6: {
7: //創建字節文件讀取流
8: FileInputStream fis = new FileInputStream("pic1.png");
9: //創建字節文件輸入流
10: FileOutputStream fos = new FileOutputStream("pic2.png");
11:
12: //定義緩沖區
13: byte[] buf = new byte[1024];
14:
15: //讀取字節到緩沖區,並寫入輸出流,即寫入到文件
16: int len = -1;
17: while( (len = fis.read(buf)) != -1)
18: {
19: fos.write(buf,0,len);
20: }
21:
22: //關閉資源
23: fis.close();
24: fos.close();
25:
26: }
27: }
字符流
字符流:以字符為導向的流
字符流只能操作文本,下面是字符流拷貝文本文件的例子
1: import java.io.*;
2:
3: class IOFileCopyDemo
4: {
5: public static void main(String[] args) throws IOException
6: {
7: //創建字符文件輸入流
8: FileReader fr = new FileReader("IODemo1.java");
9:
10: //創建字符文件輸出流
11: FileWriter fw = new FileWriter("IODemo2.java");
12:
13: //字符緩沖區
14: char[] data = new char[1024];
15:
16: int len = -1;
17:
18: //讀入字符,並寫入文件
19: while( (len = fr.read(data)) != -1)
20: {
21: fw.write(data,0,len);
22: }
23:
24: //關閉資源
25: fw.close();
26: fr.close();
27:
28: }
29: }
轉換流
InputStreamReader,OutputStreamWriter
InputStreamReader(InputStream in):接收字節流,轉換為字符流
InputStreamReader(InputStream in, Charset cs):接收字節流,按照指定的編碼表轉換為字符流
其實FileReader就是使用系統默認編碼表的轉換流,其內部使用的也是字節流,因此,下面兩句是一樣的
FileReader fr = new FileReader(“1.txt”);
InputStreamReader isr = new InputStreamReader(new FileInputStream(“1.txt”),”GDK”);
緩沖區與裝飾設計模式
緩沖區
顧名思義,對數據起到一個緩沖的作用,減少了流之間的耦合性,減少了每次與硬盤設備之間的通信,提供了效率
BufferedWriter,BufferedReader,BufferedInputStream,BufferedOutputStream實現了對對應流的緩沖(其實內部就是定義了一個數組,無論讀一個數組或者一個字,內部都會事先讀取好一個足夠大的緩沖區數組,供你使用)
裝飾設計模式
當我們對一個體系中的類進行功能加強時,如果對每個類都定義其子類,會使得整個體系顯得非常臃腫,而且擴展性不好,沒出現一個新類,就要對其創建一個用於功能增強的子類,整個時候就出現了裝飾類,這個裝飾類就是對一個體系的類都進行功能的加強,使用時傳入體系中類的對象,同時這個裝飾類又應該屬於這個體系
例如:BufferedReader,對Reader體系中的所有類進行加強,加入緩沖技術,方法的接口中使用的是父類引用,利用多態提高了功能擴展性
裝飾設計模式的演變過程
IO異常處理方式
IO的異常基類為IOException,是Exception的子類,代表需要被程序員處理
由於IO涉及到了各種資源,所以try處理時,必須要在finally塊中進行關閉資源操作
1: /*
2: IO異常處理
3: */
4:
5: import java.io.*;
6:
7: class IOExceptionHandleDemo
8: {
9: public static void main(String[] args)
10: {
11: FileWriter fw = null;
12: FileReader fr = null;
13: try
14: {
15: fw = new FileWriter("IODemo1.txt");
16: fr = new FileReader("IODemo2.txt");
17: fw.write(fr.read());
18:
19: }
20: catch (IOException e)
21: {
22: System.out.println(e.toString());
23: }
24: finally
25: {
26: if(fw != null)
27: {
28: try
29: {
30: fw.close();
31: }
32: catch (IOException e)
33: {
34: System.out.println("close exception!");
35: }
36: }
37: if(fr != null)
38: {
39: try
40: {
41: fr.close();
42: }
43: catch (IOException e)
44: {
45: System.out.println("close exception!");
46: }
47: }
48: }
49: }
50: }
Java IO 字節流與字符流 (二)