NIO和BIO如何影响应用程序的设计-数据处理
使用純粹的?NIO設計相較?BIO設計,數據處理也受到影響。
在?BIO設計中,我們從?InputStream或?Reader逐字節讀取數據。假設你正在處理一基于行的文本數據流,例如:
有如下一段文本:
Name:Tom Age:18 Email: tom@qq.com Phone:13888888888該文本行的流可以這樣處理:
FileInputStream input = new FileInputStream("d://info.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); String nameLine = reader.readLine(); String ageLine = reader.readLine(); String emailLine = reader.readLine(); String phoneLine = reader.readLine();請注意處理狀態由程序執行多久決定。換句話說,一旦?reader.readLine()方法返回,你就知道肯定文本行就已讀完,readline()阻塞直到整行讀完,這就是原因。你也知道此行包含名稱;同樣,第二個?readline()調用返回的時候,你知道這行包含年齡等。正如你可以看到,該處理程序僅在有新數據讀入時運行,并知道每步的數據是什么。一旦正在運行的線程已處理過讀入的某些數據,該線程不會再回退數據(大多如此)。下圖也說明了這條原則:
(Java BIO: 從一個阻塞的流中讀數據) 而一個NIO 的實現會有所不同,下面是一個簡單的例子:
ByteBuffer buffer = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buffer);注意第二行,從通道讀取字節到ByteBuffer。當這個方法調用返回時,你不知道你所需的所有數據是否在緩沖區內。你所知道的是,該緩沖區包含一些字節,這使得處理有點困難。
假設第一次read(buffer)調用后,讀入緩沖區的數據只有半行,例如,“Name:An”,你能處理數據嗎?顯然不能,需要等待,直到整行數據讀入緩存,在此之前,對數據的任何處理毫無意義。
所以,你怎么知道是否該緩沖區包含足夠的數據可以處理呢?好了,你不知道。發現的方法只能查看緩沖區中的數據。其結果是,在你知道所有數據都在緩沖區里之前,你必須檢查幾次緩沖區的數據。這不僅效率低下,而且可以使程序設計方案雜亂不堪。例如:
ByteBuffer buffer = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buffer); while(!bufferFull(bytesRead)) {bytesRead = inChannel.read(buffer); }bufferFull()方法必須跟蹤有多少數據讀入緩沖區,并返回真或假,這取決于緩沖區是否已滿。換句話說,如果緩沖區準備好被處理,那么表示緩沖區滿了。
bufferFull()方法掃描緩沖區,但必須保持在bufferFull()方法被調用之前狀態相同。如果沒有,下一個讀入緩沖區的數據可能無法讀到正確的位置。這是不可能的,但卻是需要注意的又一問題。
如果緩沖區已滿,它可以被處理。如果它不滿,并且在你的實際案例中有意義,你或許能處理其中的部分數據。但是許多情況下并非如此。下圖展示了“緩沖區數據循環就緒”:
?
總結
以上是生活随笔為你收集整理的NIO和BIO如何影响应用程序的设计-数据处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NIO和BIO如何影响应用程序的设计-A
- 下一篇: NIO和BIO如何影响应用程序的设计-设