Java I/O流常用類小結
File類
File類是 IO 包中唯一代表磁盤文件本身的對象,File類定義了一些與平臺無關的方法來操縱文件
File f = new File("d:/test/1.txt");
常用方法見 API
delete 方法刪除由File對象的路徑所表示 對磁盤文件或目錄。如果刪除的對象是目錄,該目錄中的內容必須為空。
節點流
我們將IO流類分為兩個大類,節點流類和過濾流類(也叫處理流類)。
1. 程序用于直接操作目標設備所對應的類叫節點流類
2. 程序也可以通過一個間接流類去調用結點流類,以達到更加靈活方便地讀寫各種類型的數據,這個間接流類就是過濾流類(也叫處理流類)
InputStream 與 OutputStream (抽象類[字節流])
程序可以從中連續 讀取字節 的對象叫輸入流,用InputStream類完成
int read() // 返回 -1 表示遇到流的末尾,結束 int read(byte[] b) //讀入b.length個直接放入到b中并返回實際讀入的字節數 int read(byte[] b,int off,int len) void close() //關閉,通知系統釋放與這個流相關的資源 |
程序能向其中連續 寫入字節 的對象叫輸出流,用OutputStream類完成
void write(int b) //將一個直接寫到輸入流 void write(byte[] b) //將整個直接數組寫到輸出流中 void write(byte[] b,int off,int len) // void flush() //徹底完成輸出并清空緩沖區 void close() //關閉輸出流 |
這里的輸入輸出是針對程序而言的,而非文件。
輸入: 程序讀取 輸出:程序寫出
將A文件的內容寫入文件B中:
我們應該創建一個輸入類來完成對A文件的操作,再創建一個輸出類來完成對B文件的操作。
FileInputStream 與 FileOutputStream
這兩個源節點用來操作磁盤文件,在創建一個FileInputStream對象時通過構造函數指定文件的路徑和名字,當然這個文件應當是存在的和可讀的。在創建一個FileOutputStream對象時指定文件如果存在將要被覆蓋。
只能用來讀取字節或字節數組!!!因此字符串需要使用getBytes()方法轉為字節數組。
注:unicode是雙字節的,而ASCII是單字節的。java中的字符默認使用unicode編碼!
編程實現利用FileOutputStream類向文件寫入一串字符,并用FileInputStream讀出:
public class FileStreamDemo { public static void main(String[] args) { File f = new File("Hello.txt"); //輸出到文件中 try { FileOutputStream out = new FileOutputStream(f); byte buf[] = "hello,well".getBytes();//轉成字節輸出 out.write(buf); out.close(); } catch (Exception e) { e.printStackTrace(); } //從文件中讀出顯示到屏幕上 try { FileInputStream in = new FileInputStream(f); byte[] buff = new byte[1024]; int len = in.read(buff); System.out.println(new String(buff,0,len)); } catch (Exception e) { e.printStackTrace(); } } } |
為什么要 close ?
Java垃圾回收器只能管理程序中的類的實例對象,沒法去管理系統產生的資源,所以程序要調用 close 方法,去通知系統去釋放其自身產生的資源。
這兩個類都只提供了對字節或字節數組進行讀出的方法。對于字符串的讀寫,我們還需要進行額外的轉換。
Reader和Writer
1. 抽象類,用于直接讀取字符串文本
2. Java為字符文本(直接讀取字符串)的輸入輸出專門提供的一套單獨的類,其在處理字符串時簡化了我們的編程。
對上面的程序進行如下的修改:—— 使用FileWriter 和 FileReader類來實現直接對字符串的讀取:
public class FileStreamDemo2 { public static void main(String[] args) { File f = new File("Hello.txt"); try { FileWriter out = new FileWriter(f); out.write("hello world,hahaha"); out.close(); } catch (Exception e) { e.printStackTrace(); } try { FileReader in = new FileReader(f); char[] buf = new char[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); } catch (Exception e) { e.printStackTrace(); } } } |
FileReader的真正優勢要結合包裝流類才能體現出來!!
PipedInputStream 與 PipedOutputStream
一個PipeInputStream對象必須和一個PipedOutputStream對象進行連接而產生一個通信管道。
這兩個類主要來完成線程之間的通信。 --- p 266
一個線程的PipedInputStream對象能夠從另一個線程的PipedOutputStream對象中讀取數據。
void connect(PipedOutputStream src)使此管道輸入流連接到管道輸出流 src。
JDK還提供了PipedWriter和PipedReader這兩個類來用于字符串文本的管道通信。
使用管道流,可以實現各個程序模塊之間的松耦合通信。
ByteArrayInputStream 與 ByteArrayOutputStream
1. 使用字節數組作為數據源
2. 作用:使用IO流的方式來完成對字節數組內容的讀寫
IO程序代碼的復用
由于沒有編碼為 -1 的字符,所以OS使用 -1 作為硬盤上的每個文件的結尾標記
文本文件與二進制文件:
1. 如果一個文件專用于存儲文本字符的數據,沒有包含字符之外的其他數據,我們稱之為文本文件
2. 除此之外的文件就是二進制文件
為了支持標準輸入輸出設備,Java定義了兩個特殊的流對象:System.in 和 System.out
System.in 對應鍵盤,是InPutStream類型的,從鍵盤讀取數據
System.out 對應屏幕,是PrintStream類型的
Scanner類
該類不屬于IO類,而屬于util類
它是一個可以用正則表達式來解析基本類型和字符串的簡單文本掃描器
Scanner 使用分隔符模式將其輸入分解為標記,默認情況下該分隔符模式與空白匹配。然后可以使用不同的next 方法將得到的標記轉換為不同類型的值。
例如從鍵盤讀取一行輸入:
<span style="font-size:14px;"> Scanner cin = new Scanner(System.in);
String name = cin.nextLine();</span>
過濾流與包裝流:
--- 即中間類,為哦我們往IO設備中寫入各種類型的數據提供了幫助
DataOutputStream
writeBoolean()
writeShort()
writeChar()
writeInt()
......
程序 ---> 包裝流類 ----> 節點流類 ---> 目標
輸入包裝類 -- see p273 的例子
輸出包裝類 --
包裝流的使用:
DataOutputStream(OutputStream out) //將OutputStream包裝為DataOutputStream
BufferedInputStream 與 BufferOutputStream
---緩沖流:對IO進行緩沖
利用緩沖流來進行改善性能
構造方法:
BufferedInputStream(InputStream in)
創建一個帶有32直接緩沖區的緩沖流
BufferedInputStream(InputStream in, int size)
創建具有指定緩沖區大小的緩沖區
BufferedOutputStream(OutputStream out)
創建一個新的緩沖輸出流,以將數據寫入指定的底層輸出流。
BufferedOutputStream(OutputStream out, int size)
創建一個新的緩沖輸出流,以將具有指定緩沖區大小的數據寫入指定的底層輸出流。
DataInputStream 與 DataOutputStream
———— 提供了可讀寫各種基本數據類型數據的各種方法
DataOutputStream提供了3種寫入字符串的方法:
1. writeBytes(String s)
2. writeChars(String s)
3. writeUTF(Strng s)
PrintStream類
提供了一系列的print和println方法,可以實現將基本數據類型的格式化成字符串輸出。
構造函數:
PrintStream(OutputStream out)
PrintStream(OutputStream out, boolean autoflush)
PrintStream(OutputStream out, boolean autoflush, String encoding)
autoflush控制java在遇到換行符(\n)時是否自動清空緩沖區
Java的PrintStream對象具有多個重載的Print和Println方法
在Windows的文本換行是 “\r\n” 而Linux下的文本換行是“\n”
PrintWriter的println方法能根據不同的操作系統生成相應的換行符
PrintWriter類 -- 與PrintStream相對應
該類若設置autoFlush, 其會在使用了println方法后使用自動清空緩沖區
ObjectInputStream 與 ObjectOutputStream
用于存儲和讀取對象的輸入輸出流類。
posted on 2014-03-20 11:27 順其自然EVO 閱讀(231) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄