Java中的stream流的概念解析及現實應用總結。本站提示廣大學習愛好者:(Java中的stream流的概念解析及現實應用總結)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中的stream流的概念解析及現實應用總結正文
流是字節序列的籠統概念。
文件是數據的靜態存儲情勢,而流是指數據傳輸時的形狀。
流類分為兩個年夜類:節點流類和過濾流類(也叫處置流類)。
法式用於直接操作目的裝備所對應的類叫節點流類,法式也能夠經由過程一個直接流類去挪用節點流類,以到達加倍靈巧便利地讀取各類類型的數據,這個直接流類就是過濾流類(也叫處置流類),或許稱為包裝類。
包裝類的挪用進程以下圖:
流分類的關系
不論流的分類是何等的豐碩和龐雜,其本源來自於四個根本的類。這個四個類的關系以下:
字撙節
字符流
輸出流
InputStream
Reader
輸入流
OutputStream
Writer
Java內用 Unicode 編碼存儲字符,字符流處置類擔任將內部的其他編碼的字符流和java內 Unicode 字符流之間的轉換。而類InputStreamReader 和OutputStreamWriter處置字符流和字撙節的轉換。字符流(一次可以處置一個緩沖區)一次操作比字撙節(一次一個字節)效力高。
InputStream
因為InputStream和OutputStream是abstact類,所以它們還不克不及注解詳細對應哪一種IO裝備。它們上面有很多子類,包含收集、管道、內存、文件等詳細的IO裝備,現實法式中應用的它們的各類子類對象。
注:我們將節點流類所對應的IO源和目的稱為流節點(Node)。
留意:將A文件的內容寫入B文件,法式對A文件的操作所用的是輸入類照樣輸出類這個成績。輸出輸入類是絕對法式而言的,而不是代表文件的,所以我們應當創立一個輸出類來完成對A文件的操作,創立一個輸入類來完成對B文件的操作。
OutputStream
以字符為導向的 stream Reader/Writer
以 Unicode 字符為導向的 stream ,表現以 Unicode 字符為單元從 stream 中讀取或往 stream 中寫入信息。異樣,Reader/Writer也為abstact類。
Reader
Writer
IO法式代碼的復用:
日常平凡寫代碼用-1來作為鍵盤輸出的停止,在寫的函數中不直接應用System.in,只是在挪用該函數時,將System.in作為參數傳遞出來,如許,我們今後要從某個文件中讀取數據,來取代手工鍵盤輸出時,我們可以直接應用這個函數,法式就不消做太多的修正了,到達以不變應萬變的後果。
字撙節和字符流的互相轉換
InputStreamReader和OutputStreamReader:把一個以字節為導向的stream轉換成一個以字符為導向的stream。
InputStreamReader類是從字撙節到字符流的橋梁:它讀入字節,並依據指定的編碼方法,將之轉換為字符流。
應用的編碼方法能夠由稱號指定,或平台可接收的缺省編碼方法。
InputStreamReader的read()辦法之一的每次挪用,能夠促使從根本字節輸出流中讀取一個或多個字節。
為了到達更高效力,斟酌用BufferedReader封裝InputStreamReader,
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Java流應用的一點總結
最經任務中碰著很多Java流的應用,總結以下:
1. 生成Zip格局,碰到的是要在一個Servlet中生成Zip文件,輸入到web 客戶端,直接下載。
response.setContentType("application/zip"); response.addHeader("Content-Disposition", "attachment;filename=/"xxx.zip/""); ZipOutputStream out = new ZipOutputStream(response.getOutputStream()) for() { ZipEntry entry = new ZipEntry("aa" + i ".dat"); out.putNewEntry(entry); bytes[] bt = s.getBytes(); out.writeBytes(bt, 0, bt.length()); out.closeEntry(); } out.flush(); out.close();
ZipOutputStream 繼續自 java.io.FilterOutputStream. 是以真實的寫操作是經由過程參數OutputStream out去寫的。
其 void write(byte[] b, int off, int len) 終究挪用了 out.write(b, off, len);
假如要生成一個zip文件,結構時就如許寫 new ZipOutputStream(new FileOutputStream(path));
2. 相似的寫XML.
XMLWriter writer = new XMLWriter(new FileOutputStream(path), formater)
writer.write(doc).事理和下面相似
3. 寫文本文件,追加。
PrintStream ps = new PrintStream(new FileOutputStream(path, true), "utf-8") ps.println(s); // 能寫boolean、int等各類類型。PrintSteam異樣繼續自FilterOutputStream
DataOutputStream out = new DataOutputStream(socket.getOutputStream()); out.writeBytes(bt); out.writeBoolean(boolean v) ;
DataOutputStream異樣是一個自FilterOutputStream.
5. 從文本中讀取
BufferedReader reader = new BufferedReader(new FileReader(path)); reader.readLine();
BufferedReader的形式和下面的Filter形式一樣,其外部存儲一個Reader對象為參數傳出去並用來現實讀取的對象。
BufferedReader對應java 1.0的類就是BufferedInputStream,是一個FilterInputStream。
6. 從Socket中讀取
BufferedInputStream is = new BufferedInputStream(socket.getInputStream()); is.read(bt, 0, bt.length());
總結:
基類Stream系列是InputStream和OutputStream,他們是籠統類,請求的辦法只要(以Output為例)
void write(int b) throws IOException; void write(byte b[]) throws IOException void write(byte b[], int off, int len)
其最根本的只是字節操作。第1個辦法看似寫一個整數,其實只寫一個字節(最低八個bit)。其子類分兩個系列,一個是直接操作輸入裝備的,我們下面碰著的有文件(FileOutputStream)和Servlet輸入(ServletOutputStream)。其他經常使用的還有一個 ByteArrayOutputStream,是直接在內存裡操作的。
再就是FilterOutputStream系列了,都是吸收一個OutputStream對象坐位參數,真實的寫操作經由過程該對象去完成。例如ZipOutputStream,其自己只擔任生成緊縮格局的數據,至於這些數據是寫到文件、內存、照樣servletResponse,由輸出的參數肯定。這就是裝潢器形式。
Filter系列經常使用的有PrintStream(供給了print,println,write(boolean[int, char, string])各類操作,終究應用out.write辦法以寫字節的方法寫出來。
還有DataOutputStream,其供給了writeByte/writeBoolean/writeDouble/writeLong/wiretUTF等辦法。
還有就是socket/zip等不經常使用的。
Java的流很便利也很龐雜。龐雜就龐雜在完成一個功效常常須要多個類,並且有多種組合的方法。尚需持續在理論中總結。