程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中的stream流的概念解析及現實應用總結

Java中的stream流的概念解析及現實應用總結

編輯:關於JAVA

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
其外部應用一個OutputStreamWriter的對象textOut來寫。例如write(String s)終究挪用到textOut.write(s);
    
這裡觸及到編碼的成績。其參數裡的"utf-8"終究傳遞到OutputStream。
    
OutputStream是一個字符流和字撙節之間的橋梁。
 是以其供給了write(char[] cbuf, int off, int len) 和 write(String str, int off, int len) 用來寫字符和字符串。
OutputStream外部又經由過程一個StreamEncoder對象來序列化字符和字符串。
4. 寫出到socket。
 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的流很便利也很龐雜。龐雜就龐雜在完成一個功效常常須要多個類,並且有多種組合的方法。尚需持續在理論中總結。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved