最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決bufferedReader.readLine()讀到最后發(fā)生阻塞的問(wèn)題

 更新時(shí)間:2021年07月21日 17:08:33   作者:bugskiller_cn  
這篇文章主要介紹了解決bufferedReader.readLine()讀到最后發(fā)生阻塞的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

bufferedReader.readLine()讀到最后發(fā)生阻塞

最近在做一個(gè)imageserver,需求簡(jiǎn)化后就是使用socket響應(yīng)HTTP請(qǐng)求從而截取所需要的數(shù)據(jù)流,寫(xiě)入到服務(wù)器端的文件中,從而完成客戶(hù)端將圖片上傳到服務(wù)器。

因?yàn)閺目蛻?hù)端得到的數(shù)據(jù)流中,我們只希望截取其中的一部分。這樣就使我們無(wú)法像經(jīng)常那樣邊讀邊向文件中寫(xiě)入,而且在流已經(jīng)讀到末尾時(shí),使用bufferedInputStream.read()>0或inputStream.read()>0作為while語(yǔ)句結(jié)束的判斷條件在使用socket獲得的數(shù)據(jù)流中是無(wú)法返回-1(因?yàn)榭蛻?hù)端是通過(guò)瀏覽器提交的form表單,它無(wú)法告訴服務(wù)器的socket數(shù)據(jù)已經(jīng)發(fā)送結(jié)束。因此read()方法還在等待客戶(hù)端發(fā)送消息產(chǎn)生了阻塞)。

但是我們?nèi)绻皇褂胋ufferedInputStream.read(),我們就無(wú)法得到客戶(hù)端的數(shù)據(jù)流。那么我們將如何取得數(shù)據(jù)流,并避免在讀取數(shù)據(jù)時(shí)發(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對(duì)象用來(lái)存儲(chǔ)之前已經(jīng)解析的http請(qǐng)求消息中Content-Length的值

這樣循環(huán)讀數(shù)據(jù)可以解決兩個(gè)問(wèn)題:

1、避免使用read()方法造成的整個(gè)程序陷入阻塞。

2、當(dāng)讀的數(shù)據(jù)流較大時(shí),還可以防止read()方法不能完全讀取。

這樣問(wèn)題即可解決,完美!

BufferedReader的readline()踩坑

剛剛踩了一個(gè)readLine()方法的小坑

本來(lái)功能沒(méi)有問(wèn)題,但是根據(jù)下面的代碼,我的lineStr一直為Null,看來(lái)網(wǎng)上的挺多這種相關(guān)的問(wèn)題,但是和我的問(wèn)題都不一樣;

這里是有問(wèn)題的代碼:

BufferedReader br = new BufferedReader(new InputStreamReader(in));
            // 讀取結(jié)果
            System.out.println("獲取:"+br.readLine());//注意這里是先打印了
            String lineStr = br.readLine();//然后在獲取的

后面我根據(jù)看別人解釋readLine方法,發(fā)現(xiàn)是因?yàn)閞eadLine方法讀取了一行之后,不關(guān)閉就會(huì)讀取下一行,而我只需要讀取一行,所以我原來(lái)的打印吧數(shù)據(jù)拿出來(lái)了,在給lineStr賦值時(shí)它去打印下一行根本沒(méi)有東西,于是我把上面的打印刪掉解決了這個(gè)問(wèn)題

下面是修改了的:

BufferedReader br = new BufferedReader(new InputStreamReader(in));
            // 讀取結(jié)果
            String lineStr = br.readLine();//直接賦值

這本身可能不算問(wèn)題哈,但是難為了我小半天,做個(gè)記錄。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java+mysql實(shí)現(xiàn)登錄和注冊(cè)功能

    java+mysql實(shí)現(xiàn)登錄和注冊(cè)功能

    這篇文章主要為大家詳細(xì)介紹了java+mysql實(shí)現(xiàn)登錄和注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 初識(shí)Java設(shè)計(jì)模式適配器模式

    初識(shí)Java設(shè)計(jì)模式適配器模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式適配器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java 重入鎖和讀寫(xiě)鎖的具體使用

    Java 重入鎖和讀寫(xiě)鎖的具體使用

    這篇文章主要介紹了Java 重入鎖和讀寫(xiě)鎖的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Spring?Boot?快速使用?HikariCP?連接池配置詳解

    Spring?Boot?快速使用?HikariCP?連接池配置詳解

    Spring Boot 2.x 將其作為默認(rèn)的連接池組件,項(xiàng)目中添加 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 模塊后,HikariCP 依賴(lài)會(huì)被自動(dòng)引入,這篇文章主要介紹了Spring?Boot使用HikariCP連接池配置詳解,需要的朋友可以參考下
    2023-06-06
  • ELK搭建線上日志收集系統(tǒng)

    ELK搭建線上日志收集系統(tǒng)

    ELK日志收集系統(tǒng)進(jìn)階使用,本文主要講解如何打造一個(gè)線上環(huán)境真實(shí)可用的日志收集系統(tǒng),有了它,你就可以和去服務(wù)器上撈日志說(shuō)再見(jiàn)了
    2022-07-07
  • java int轉(zhuǎn)byte和long轉(zhuǎn)byte的方法

    java int轉(zhuǎn)byte和long轉(zhuǎn)byte的方法

    下面小編就為大家?guī)?lái)一篇java int轉(zhuǎn)byte和long轉(zhuǎn)byte的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • springboot整合消息隊(duì)列RabbitMQ

    springboot整合消息隊(duì)列RabbitMQ

    這篇文章主要介紹了springboot整合消息隊(duì)列RabbitMQ,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Java輸入字母來(lái)判斷星期幾的實(shí)現(xiàn)代碼

    Java輸入字母來(lái)判斷星期幾的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java輸入字母來(lái)判斷星期幾的實(shí)現(xiàn)代碼,用情況語(yǔ)句比較好,如果第一個(gè)字母一樣,則判斷用情況語(yǔ)句或if語(yǔ)句判斷第二個(gè)字母需要的朋友可以參考下
    2017-02-02
  • SpringBoot配置Ollama實(shí)現(xiàn)本地部署DeepSeek

    SpringBoot配置Ollama實(shí)現(xiàn)本地部署DeepSeek

    本文主要介紹了在本地環(huán)境中使用?Ollama?配置?DeepSeek?模型,并在?IntelliJ?IDEA?中創(chuàng)建一個(gè)?Spring?Boot?項(xiàng)目來(lái)調(diào)用該模型,文中通過(guò)圖文示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • 使用Swing繪制動(dòng)態(tài)時(shí)鐘

    使用Swing繪制動(dòng)態(tài)時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了使用Swing繪制動(dòng)態(tài)時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評(píng)論

原平市| 凤山县| 庆云县| 安阳市| 遂溪县| 镇远县| 杭锦后旗| 谢通门县| 鸡东县| 吕梁市| 赣榆县| 乡宁县| 兴海县| 阿勒泰市| 泰宁县| 六安市| 卢湾区| 德惠市| 武清区| 吉水县| 周口市| 揭西县| 闻喜县| 桓仁| 宁武县| 枣庄市| 加查县| 南宫市| 治县。| 云林县| 吉水县| 长阳| 当涂县| 綦江县| 嘉荫县| 海南省| 青铜峡市| 赣州市| 渭源县| 张掖市| 黄骅市|