欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

但是我們?nèi)绻皇褂胋ufferedInputStream.read(),我們就無法得到客戶端的數(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ì)象用來存儲(chǔ)之前已經(jīng)解析的http請(qǐng)求消息中Content-Length的值

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

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

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

這樣問題即可解決,完美!

BufferedReader的readline()踩坑

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

本來功能沒有問題,但是根據(jù)下面的代碼,我的lineStr一直為Null,看來網(wǎng)上的挺多這種相關(guā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ì)讀取下一行,而我只需要讀取一行,所以我原來的打印吧數(shù)據(jù)拿出來了,在給lineStr賦值時(shí)它去打印下一行根本沒有東西,于是我把上面的打印刪掉解決了這個(gè)問題

下面是修改了的:

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

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

相關(guān)文章

  • java  StringBuilder類的詳解及簡單實(shí)例

    java StringBuilder類的詳解及簡單實(shí)例

    這篇文章主要介紹了java StringBuilder類的詳解及簡單實(shí)例的相關(guān)資料,實(shí)現(xiàn)了StringBuilder類的追加、插入、替換、刪除等操作,需要的朋友可以參考下
    2017-08-08
  • Maven將Jar包打入本地倉庫的實(shí)現(xiàn)

    Maven將Jar包打入本地倉庫的實(shí)現(xiàn)

    項(xiàng)目需要用到一個(gè)Jar包,不能從遠(yuǎn)程倉庫拉取,只有一個(gè)Jar包,所以需要將Jar包打入到本地倉庫才能引入項(xiàng)目,本文主要介紹了Maven將Jar包打入本地倉庫的實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12
  • SpringBoot中的ExpiringMap代碼實(shí)例

    SpringBoot中的ExpiringMap代碼實(shí)例

    這篇文章主要介紹了SpringBoot中的ExpiringMap代碼實(shí)例,ExpiringMap是一個(gè)可以設(shè)置過期策略、可變條目過期、延遲條目加載和過期偵聽器的線程安全存儲(chǔ)容器,需要的朋友可以參考下
    2023-08-08
  • Java 異步編程實(shí)踐_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java 異步編程實(shí)踐_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    異步編程提供了一個(gè)非阻塞的,事件驅(qū)動(dòng)的編程模型。下面通過本文給大家介紹Java 異步編程實(shí)踐,感興趣的的朋友一起看看吧
    2017-05-05
  • 一文搞懂SpringBoot如何利用@Async實(shí)現(xiàn)異步調(diào)用

    一文搞懂SpringBoot如何利用@Async實(shí)現(xiàn)異步調(diào)用

    異步調(diào)用幾乎是處理高并發(fā),解決性能問題常用的手段,如何開啟異步調(diào)用?SpringBoot中提供了非常簡單的方式,就是一個(gè)注解@Async。今天我們重新認(rèn)識(shí)一下@Async,以及注意事項(xiàng)
    2022-09-09
  • 最長重復(fù)子數(shù)組 findLength示例詳解

    最長重復(fù)子數(shù)組 findLength示例詳解

    今天給大家分享一道比較常問的算法面試題,最長重復(fù)子數(shù)組 findLength,文中給大家分享解題思路,結(jié)合示例代碼介紹的非常詳細(xì),需要的朋友參考下吧
    2023-08-08
  • springboot中使用redis并且執(zhí)行調(diào)試lua腳本

    springboot中使用redis并且執(zhí)行調(diào)試lua腳本

    今天有個(gè)項(xiàng)目需要使用redis,并且有使用腳本的需求,本文主要介紹了springboot中使用redis并且執(zhí)行調(diào)試lua腳本,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 一文搞懂Java的SPI機(jī)制(推薦)

    一文搞懂Java的SPI機(jī)制(推薦)

    Java定義了一套JDBC的接口,但并未提供具體實(shí)現(xiàn)類,而是在不同云廠商提供的數(shù)據(jù)庫實(shí)現(xiàn)包。這篇文章給大家介紹Java的SPI機(jī)制,感興趣的朋友一起看看吧
    2021-11-11
  • 詳解Java關(guān)于JDK中時(shí)間日期的API

    詳解Java關(guān)于JDK中時(shí)間日期的API

    這篇文章主要介紹了詳解Java關(guān)于JDK中時(shí)間日期的API,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java 8新時(shí)間日期庫java.time的使用示例

    Java 8新時(shí)間日期庫java.time的使用示例

    這篇文章主要給你大家介紹了關(guān)于Java 8新時(shí)間日期庫java.time的使用示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評(píng)論