Java中流的實現(xiàn)是在java.io包中定義類的層次結(jié)構(gòu)的,。
輸出流: 程序能向其中寫入數(shù)據(jù)的流,。
字節(jié)流:以字節(jié)(8位二進制)為單位進行處理,。主要用于讀寫諸如圖像或聲音的二進制數(shù)據(jù),。
字符流:以字符(16位二進制)為單位進行處理。
都是通過字節(jié)流的方式實現(xiàn)的,。字符流是對字節(jié)流進行了封裝,,方便操作,。在最底層,所有的輸入輸出都是字節(jié)形式的,。
節(jié)點流:從特定的地方讀寫的流類,如磁盤或者一塊內(nèi)存區(qū)域,。
過濾流:使用節(jié)點流作為輸入或輸出,。過濾流是使用一個已經(jīng)存在的輸入流或者輸出流連接創(chuàng)建的。
類 InputStream
java.lang.Object
java.io.InputStream
從輸入流中讀取數(shù)據(jù)的下一個字節(jié),。
int read(byte[] b)
從輸入流中讀取一定數(shù)量的字節(jié),,并將其存儲在緩沖區(qū)數(shù)組 b 中。
int read(byte[] b, int off, int len)
將輸入流中最多 len 個數(shù)據(jù)字節(jié)讀入 byte 數(shù)組,。
循環(huán)讀取
關閉輸入流
這里使用InputStream的子類FileInputStream讀入文件:
public static void main(String[] args) throws IOException { //創(chuàng)建文件輸入流 InputStream is = new FileInputStream("D:/itzhai/arthinking.txt"); //創(chuàng)建字節(jié)緩沖 byte[] buffer = new byte[100]; int length = 0; //以字節(jié)形式循環(huán)讀取文件 while((length = is.read(buffer, 0, buffer.length)) != -1){ //把字節(jié)轉(zhuǎn)換成字符并輸出 String str =new String(buffer, 0, length); System.out.println(str); } }
把字節(jié)數(shù)組作為源的輸入流,。
字節(jié)數(shù)組輸入流:
public static void main(String[] args) { //創(chuàng)建讀取數(shù)據(jù)源 String input = "arthinking"; //獲取字節(jié)數(shù)組 byte[] b = input.getBytes(); //創(chuàng)建字節(jié)數(shù)組輸出流 ByteArrayInputStream bis = new ByteArrayInputStream(b); //循環(huán)逐個讀取 for(int i = 0; i < input.length(); i++){ int c; //讀取下一個字節(jié) while((c = bis.read()) != -1){ System.out.print((char)c); } } //將緩沖區(qū)的位置重置為標記位置 bis.reset(); }
字節(jié)數(shù)組輸出流:
public static void main(String[] args) throws IOException { //創(chuàng)建字節(jié)輸出流 ByteArrayOutputStream bos = new ByteArrayOutputStream(); String output = "arthinking"; //創(chuàng)建需要輸出的字節(jié)數(shù)組 byte[] buffer = output.getBytes(); //把字節(jié)數(shù)組寫到輸出流 bos.write(buffer); //創(chuàng)建文件輸出流 OutputStream os = new FileOutputStream("D:/itzhai/arthinking.txt"); //把字節(jié)輸出流寫到文件輸出流 bos.writeTo(os); }
類 OutputStream
java.lang.Object
java.io.OutputStream
將 b.length 個字節(jié)從指定的 byte 數(shù)組寫入此輸出流,。
void write(byte[] b, int off, int len)
將指定 byte 數(shù)組中從偏移量 off 開始的 len 個字節(jié)寫入此輸出流。
abstract void write(int b)
將指定的字節(jié)寫入此輸出流,。
由此可以看出,,只有最后一個方法才是抽象的,原因是前面兩個都調(diào)用了第三個抽象方法,,這樣繼承這個抽象類的子類都必須提供抽象的write(int b)的實現(xiàn),,從而使得每個子類的實現(xiàn)都不一樣。
循環(huán)寫入
關閉輸入流
這里使用了OutputStream的子類FileOutputStream輸出到文件:
public static void main(String[] args) throws IOException { //創(chuàng)建一個輸出流 OutputStream os = new FileOutputStream("D:/itzhai/arthinking.txt", true); String output = "http://www."; //從字符串中獲取字節(jié)數(shù)組 byte[] buffer = output.getBytes(); //寫出到輸出流 os.write(buffer); //關閉輸出流 os.close(); }
過濾流不能直接跟文件打交道,,只能通過節(jié)點流進行相關的操作,。可以從其構(gòu)造方法中看出:
FilterOutputStream(OutputStream out)
需要傳入一個OutputStream,。
在InputStream和OutputStream的子類中,,F(xiàn)ilterInputStream和FilterOutputStream是過濾流,,其又派生出子類DataInputStream和DataOutputStream數(shù)據(jù)輸入流和數(shù)據(jù)輸出流,。
過濾流的主要特點是在輸入輸出數(shù)據(jù)同時對所傳輸?shù)臄?shù)據(jù)做指定類型或格式的轉(zhuǎn)換,。
該類實現(xiàn)緩沖的輸出流,。通過設置這種輸出流,,應用程序就可以將各個字節(jié)寫入底層輸出流中,而不必針對每次字節(jié)寫入調(diào)用底層系統(tǒng),。
當緩沖區(qū)寫滿或者關閉輸出流時,,一次性輸出到流,,或者調(diào)用flush()方法主動將緩沖區(qū)輸出到流,。
使用過濾流類BufferedOutputStream和DataOutputStream裝飾FilterOutputStream的例子:
public static void main(String[] args) throws IOException { //創(chuàng)建數(shù)據(jù)輸出流 DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(new FileOutputStream("D:/itzhai/arthinking.txt"))); byte a = 1; char b = 'a'; int c = 2; //使用數(shù)據(jù)輸出流對象的方法寫出數(shù)據(jù)到輸出流 dos.write(a); dos.write(b); dos.write(c); //關閉數(shù)據(jù)輸出流 dos.close(); //創(chuàng)建數(shù)據(jù)輸入流 DataInputStream dis = new DataInputStream( new BufferedInputStream(new FileInputStream("D:/itzhai/arthinking.txt"))); //使用數(shù)據(jù)輸入流的方法從輸入流中讀取數(shù)據(jù) System.out.println(dis.readByte() + dis.readChar() + dis.readInt()); //關閉數(shù)據(jù)輸入流 dis.close(); }
使用DataInputStream和DataOutputStream數(shù)據(jù)文件流的一般步驟:
② 基于字節(jié)文件流對象建立數(shù)據(jù)文件流對象
③ 用數(shù)據(jù)文件流對象的方法對基本類型的數(shù)據(jù)進行輸入/輸出
FileInputStream --> BufferedInputStream --> DataInputStream --> 數(shù)據(jù)
數(shù)據(jù) --> DataOutputStream --> BufferedOutputStream --> FileOutputStream