文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

解决bufferedReader.readLine()读到最后发生阻塞的问题

2024-04-02 19:55

关注

bufferedReader.readLine()读到最后发生阻塞

最近在做一个imageserver,需求简化后就是使用socket响应HTTP请求从而截取所需要的数据流,写入到服务器端的文件中,从而完成客户端将图片上传到服务器。

因为从客户端得到的数据流中,我们只希望截取其中的一部分。这样就使我们无法像经常那样边读边向文件中写入,而且在流已经读到末尾时,使用bufferedInputStream.read()>0或inputStream.read()>0作为while语句结束的判断条件在使用socket获得的数据流中是无法返回-1(因为客户端是通过浏览器提交的form表单,它无法告诉服务器的socket数据已经发送结束。因此read()方法还在等待客户端发送消息产生了阻塞)。

但是我们如果不使用bufferedInputStream.read(),我们就无法得到客户端的数据流。那么我们将如何取得数据流,并避免在读取数据时发生阻塞。

我是这样解决的:


 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对象用来存储之前已经解析的http请求消息中Content-Length的值

这样循环读数据可以解决两个问题:

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

2、当读的数据流较大时,还可以防止read()方法不能完全读取。

这样问题即可解决,完美!

BufferedReader的readline()踩坑

刚刚踩了一个readLine()方法的小坑

本来功能没有问题,但是根据下面的代码,我的lineStr一直为Null,看来网上的挺多这种相关的问题,但是和我的问题都不一样;

这里是有问题的代码:


BufferedReader br = new BufferedReader(new InputStreamReader(in));
            // 读取结果
            System.out.println("获取:"+br.readLine());//注意这里是先打印了
            String lineStr = br.readLine();//然后在获取的

后面我根据看别人解释readLine方法,发现是因为readLine方法读取了一行之后,不关闭就会读取下一行,而我只需要读取一行,所以我原来的打印吧数据拿出来了,在给lineStr赋值时它去打印下一行根本没有东西,于是我把上面的打印删掉解决了这个问题

下面是修改了的:


BufferedReader br = new BufferedReader(new InputStreamReader(in));
            // 读取结果
            String lineStr = br.readLine();//直接赋值

这本身可能不算问题哈,但是难为了我小半天,做个记录。以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯