国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中的stream流的概念解析及實際運用總結

Java中的stream流的概念解析及實際運用總結

2020-05-21 11:41pizzq JAVA教程

流是指傳輸時的數據,Java為流準備了很多內置類,尤其是IO輸入輸出流非常常用,這里我們來看一下Java中的stream流的概念解析及實際運用總結

流是字節序列的抽象概念。
文件是數據的靜態存儲形式,而流是指數據傳輸時的形態。
流類分為兩個大類:節點流類和過濾流類(也叫處理流類)。
程序用于直接操作目標設備所對應的類叫節點流類,程序也可以通過一個間接流類去調用節點流類,以達到更加靈活方便地讀取各種類型的數據,這個間接流類就是過濾流類(也叫處理流類),或者稱為包裝類。
包裝類的調用過程如下圖:

Java中的stream流的概念解析及實際運用總結

 

流分類的關系
不管流的分類是多么的豐富和復雜,其根源來自于四個基本的類。這個四個類的關系如下:

  字節流 字符流
輸入流 InputStream Reader
輸出流 OutputStream Writer

 

Java內用 Unicode 編碼存儲字符,字符流處理類負責將外部的其他編碼的字符流和java內 Unicode 字符流之間的轉換。而類InputStreamReader 和OutputStreamWriter處理字符流和字節流的轉換。字符流(一次可以處理一個緩沖區)一次操作比字節流(一次一個字節)效率高。

InputStream

Java中的stream流的概念解析及實際運用總結

由于InputStream和OutputStream是abstact類,所以它們還不能表明具體對應哪種IO設備。它們下面有許多子類,包括網絡、管道、內存、文件等具體的IO設備,實際程序中使用的它們的各種子類對象。
注:我們將節點流類所對應的IO源和目標稱為流節點(Node)。
注意:將A文件的內容寫入B文件,程序對A文件的操作所用的是輸出類還是輸入類這個問題。輸入輸出類是相對程序而言的,而不是代表文件的,所以我們應該創建一個輸入類來完成對A文件的操作,創建一個輸出類來完成對B文件的操作。

OutputStream

Java中的stream流的概念解析及實際運用總結

以字符為導向的 stream Reader/Writer
以 Unicode 字符為導向的 stream ,表示以 Unicode 字符為單位從 stream 中讀取或往 stream 中寫入信息。同樣,Reader/Writer也為abstact類。

Reader
Java中的stream流的概念解析及實際運用總結

Writer

Java中的stream流的概念解析及實際運用總結

 

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的流很方便也很復雜。復雜就復雜在實現一個功能往往需要多個類,而且有多種組合的辦法。尚需繼續在實踐中總結。  

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 一级片少妇 | 日韩一区二区三区在线观看 | 在线观看免费毛片视频 | 国产精品久久免费观看spa | 免费成人黄色 | 国产在线不卡一区 | 久久99精品久久久久久噜噜 | 亚洲精品v | 亚洲精品字幕 | 高清av电影| av在线官网 | 日本丶国产丶欧美色综合 | 伊人春色在线播放 | 欧美一级在线观看 | 99青草| 一本大道专区 | 91免费版在线观看 | 欧美日韩精品一区二区在线播放 | 亚洲成人午夜电影 | 91国内外精品自在线播放 | 国产在线精品一区 | 自拍偷拍中文字幕 | 亚洲国产成人久久 | 日韩在线观看中文字幕 | 最新电影在线高清免费完整观看视频 | 国产精品手机在线 | 欧美精品一区二区三区在线播放 | 午夜影视 | 欧美日韩在线一区二区 | 久久久久国产一区二区三区 | 国产91精品一区二区绿帽 | 亚洲成人在线播放视频 | 日本久久网 | 国产区一区 | 在线观看免费黄色小视频 | 国产乱码一区二区三区在线观看 | 午夜在线 | 午夜寂寞少妇aaa片毛片 | 91精品国产综合久久福利软件 | 成人国内精品久久久久一区 | 91精品视频免费在线观看 |