解決bufferedReader.readLine()讀到最后發(fā)生阻塞的問題
bufferedReader.readLine()讀到最后發(fā)生阻塞
最近在做一個imageserver,需求簡化后就是使用socket響應HTTP請求從而截取所需要的數(shù)據(jù)流,寫入到服務器端的文件中,從而完成客戶端將圖片上傳到服務器。
因為從客戶端得到的數(shù)據(jù)流中,我們只希望截取其中的一部分。這樣就使我們無法像經(jīng)常那樣邊讀邊向文件中寫入,而且在流已經(jīng)讀到末尾時,使用bufferedInputStream.read()>0或inputStream.read()>0作為while語句結束的判斷條件在使用socket獲得的數(shù)據(jù)流中是無法返回-1(因為客戶端是通過瀏覽器提交的form表單,它無法告訴服務器的socket數(shù)據(jù)已經(jīng)發(fā)送結束。因此read()方法還在等待客戶端發(fā)送消息產(chǎn)生了阻塞)。
但是我們?nèi)绻皇褂胋ufferedInputStream.read(),我們就無法得到客戶端的數(shù)據(jù)流。那么我們將如何取得數(shù)據(jù)流,并避免在讀取數(shù)據(jù)時發(fā)生阻塞。
我是這樣解決的:
int newread = 0;
int totalread = 0;
int contentLength = Integer.parseInt(headers.get("content-length"));
byte[] bytes = new byte[contentLength];
while (totalread < contentLength) {
newread = bufferedInputStream.read(bytes, totalread, contentLength - totalread);
totalread += newread;
}
headers:自定義的map對象用來存儲之前已經(jīng)解析的http請求消息中Content-Length的值
這樣循環(huán)讀數(shù)據(jù)可以解決兩個問題:
1、避免使用read()方法造成的整個程序陷入阻塞。
2、當讀的數(shù)據(jù)流較大時,還可以防止read()方法不能完全讀取。
這樣問題即可解決,完美!
BufferedReader的readline()踩坑
剛剛踩了一個readLine()方法的小坑
本來功能沒有問題,但是根據(jù)下面的代碼,我的lineStr一直為Null,看來網(wǎng)上的挺多這種相關的問題,但是和我的問題都不一樣;
這里是有問題的代碼:
BufferedReader br = new BufferedReader(new InputStreamReader(in));
// 讀取結果
System.out.println("獲取:"+br.readLine());//注意這里是先打印了
String lineStr = br.readLine();//然后在獲取的
后面我根據(jù)看別人解釋readLine方法,發(fā)現(xiàn)是因為readLine方法讀取了一行之后,不關閉就會讀取下一行,而我只需要讀取一行,所以我原來的打印吧數(shù)據(jù)拿出來了,在給lineStr賦值時它去打印下一行根本沒有東西,于是我把上面的打印刪掉解決了這個問題
下面是修改了的:
BufferedReader br = new BufferedReader(new InputStreamReader(in));
// 讀取結果
String lineStr = br.readLine();//直接賦值
這本身可能不算問題哈,但是難為了我小半天,做個記錄。以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring?Boot?快速使用?HikariCP?連接池配置詳解
Spring Boot 2.x 將其作為默認的連接池組件,項目中添加 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 模塊后,HikariCP 依賴會被自動引入,這篇文章主要介紹了Spring?Boot使用HikariCP連接池配置詳解,需要的朋友可以參考下2023-06-06
SpringBoot配置Ollama實現(xiàn)本地部署DeepSeek
本文主要介紹了在本地環(huán)境中使用?Ollama?配置?DeepSeek?模型,并在?IntelliJ?IDEA?中創(chuàng)建一個?Spring?Boot?項目來調用該模型,文中通過圖文示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-03-03

