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

作者:bugskiller_cn 时间:2022-07-15 06:05:38 

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();//直接赋值

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

来源:https://blog.csdn.net/qq_23703157/article/details/78208096

标签:bufferedReader,readLine,阻塞
0
投稿

猜你喜欢

  • Java redisson实现分布式锁原理详解

    2022-02-18 08:34:10
  • Java框架设计灵魂之反射的示例详解

    2023-06-13 21:34:34
  • Java集合系列之ArrayList源码分析

    2023-01-31 03:02:36
  • Opencv光流运动物体追踪详解

    2023-06-21 11:55:31
  • springmvc+shiro自定义过滤器的实现代码

    2021-08-11 21:23:11
  • C#实现利用Windows API读写INI文件的方法

    2023-03-16 01:23:06
  • 使用@Order控制配置类/AOP/方法/字段的加载顺序详解

    2023-09-05 17:34:35
  • Maven属性与版本管理详细步骤分解

    2023-11-15 14:38:45
  • Java 多线程并发编程提高数据处理效率的详细过程

    2021-06-29 04:19:39
  • 通过Java设置Word页面背景色过程详解

    2022-06-22 06:23:42
  • Java基于解释器模式实现定义一种简单的语言功能示例

    2021-06-18 15:53:42
  • 如何在Unity中检测死循环和卡死

    2023-12-18 00:55:17
  • Android 文件数据存储实例详解

    2023-07-28 17:08:03
  • Spring component-scan XML配置与@ComponentScan注解配置

    2023-07-04 03:37:12
  • 详解Java接口签名(Signature)实现方案

    2022-02-05 09:28:57
  • Spring Security认证的完整流程记录

    2021-12-15 13:04:03
  • C#实现控制Windows系统关机、重启和注销的方法

    2023-07-24 17:15:05
  • Spring不能注入Static变量的原因及Spring注入静态变量

    2023-11-24 04:16:36
  • C#生成二维码的方法

    2021-11-11 02:49:21
  • 学习Java之如何正确地跳出循环结构

    2021-10-21 11:21:53
  • asp之家 软件编程 m.aspxhome.com