摘要:輸入流的復用在實際的開發中是很常見的場景。根據對的抽象,流的復用是矛盾的。檢查當前流類是否支持標記功能這三個方法能有效地解決流復用的問題。
輸入流的復用在實際的開發中是很常見的場景。
在實際應用中,很多需要提供輸入數據的API都是用IputStream類作為其參數類型,比如XML文檔的解析API就是一個典型的例子。同時很多數據的提供者允許使用者通過InputStream類的對象方式來讀取數據。
根據java對io的抽象(Stream),流的復用是矛盾的。按照流本身所代表的抽象含義,數據一旦流過去了,就無法被再次利用了。
對于現實應用中存在的對輸入流的需求,基本上來說的兩種方式可以解決;第一種是利用輸入流提供的標記和重置的控制能力,第二種則是把輸入流轉換成數據來使用。
方法一, 緩沖流類標記與重置好在java為我們提供現成的解決方案。
BufferedInputStream, BufferedOutputStream
利用這兩個類中提供的
public synchronized void mark(int readlimit) 讀取位置標記,需要一個允許讀取的字節數。
public synchronized void reset() throws IOException 將讀取位置重置到標記位置。
public boolean markSupported() 檢查當前流類是否支持標記功能
這三個方法能有效地解決流復用的問題。
java // 假如我們有三個方法,需要串行的使用我們的 io 輸入流。 // public static void process1(InputStream in) throws IOException; // public static void process2(InputStream in) throws IOException; // public static void process3(InputStream in) throws IOException; if (!input.markSupported()) { this.input = new BufferedInputStream(input); } else { this.input = input; } // 為了能夠復用整個流 this.input.mark(Integer.MAX_VALUE); process1(this.input); // 重置讀取位置,以供下一個使用者使用,以下雷同 this.input.reset(); process2(this.input); this.input.reset(); process3(this.input); this.input.reset();方法二, 將流轉化成為數據流類
這一種方案就是將流中的數據全部讀取到一個字節數組中。在不同的數據接收者之間這些數據的傳遞是通過字節數組完成的。
將 字節流轉化成字節數組 可以使用我們 ByteArrayInputStream,ByteArrayOutputStream。這樣的話,我們傳遞的是數據,而不再是原始的io。
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[2048]; for (int count=0; ( inputStream.read(buffer) ) != -1; ) { arrayOutputStream.write(buffer, 0, count); } ByteArrayInputStream byteArrayOutputStream = new ByteArrayInputStream(arrayOutputStream.toByteArray()); // byteArrayOutputStream 對象就可以作為我們需要復用的數據流,配合 `mark`和`reset` 功能提高io性能。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64225.html
摘要:綁定完成后允許套接字進行連接并等待連接。服務端根據報文返回響應,并關閉連接。單線程服務器多進程及多線程服務器復用服務器復用的多線程服務器單線程服務器一次只處理一個請求,直到其完成為止。 前言 本篇文章將涉及以下內容: IO實現Java Socket通信 NIO實現Java Socket通信 閱讀本文之前最好了解過: Java IO Java NIO Java Concurrenc...
摘要:從通道進行數據寫入創建一個緩沖區,填充數據,并要求通道寫入數據。三之通道主要內容通道介紹通常來說中的所有都是從通道開始的。從中選擇選擇器維護注冊過的通道的集合,并且這種注冊關系都被封裝在當中停止選擇的方法方法和方法。 由于內容比較多,我下面放的一部分是我更新在我的微信公眾號上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內容給列出來了,便于大家學習與回顧。 Ja...
摘要:三同步非阻塞式以塊的方式處理數據面向緩存區的采用多路復用模式基于事件驅動是實現了的一個流行框架,的。阿里云分布式文件系統里用的就是。四異步非阻塞式基于事件驅動,不需要多路復用器對注冊通道進行輪詢,采用設計模式。 一、什么是IO IO 輸入、輸出 (read write accept)IO是面向流的 二、BIO BIO是同步阻塞式IO 服務端與客戶端進行三次握手后一個鏈路建立一個線程面...
摘要:三同步非阻塞式以塊的方式處理數據面向緩存區的采用多路復用模式基于事件驅動是實現了的一個流行框架,的。阿里云分布式文件系統里用的就是。四異步非阻塞式基于事件驅動,不需要多路復用器對注冊通道進行輪詢,采用設計模式。 一、什么是IO IO 輸入、輸出 (read write accept)IO是面向流的 二、BIO BIO是同步阻塞式IO 服務端與客戶端進行三次握手后一個鏈路建立一個線程面...
摘要:基本輸入流輸入流類中包含兩類功能輸入流的兩大功能讀取流中字節數據的功能是通過方法來完成。基本輸出流與類相對應的類表示基本的輸出流,用來把數據從程序輸出到其他地方。 一堆廢話(趕快跳過) 在我們的日常開發中 I/O 涉及到我們開發的方方面面,雖然早在 JDK1.5 就新增了 NIO的概念,但是 java.io 的使用以及技巧在我們的日常開發中還是占據很高的比重。 概念(不看也行) ...
閱讀 3043·2021-11-25 09:43
閱讀 1626·2021-11-24 11:15
閱讀 2359·2021-11-22 15:25
閱讀 3501·2021-11-11 16:55
閱讀 3240·2021-11-04 16:10
閱讀 2773·2021-09-14 18:02
閱讀 1685·2021-09-10 10:50
閱讀 1070·2019-08-29 15:39