解决bufferedReader.readLine()读到最后发生阻塞的问题
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(); //然后在获取的
【解决bufferedReader.readLine()读到最后发生阻塞的问题】后面我根据看别人解释readLine方法,发现是因为readLine方法读取了一行之后,不关闭就会读取下一行,而我只需要读取一行,所以我原来的打印吧数据拿出来了,在给lineStr赋值时它去打印下一行根本没有东西,于是我把上面的打印删掉解决了这个问题
下面是修改了的:
BufferedReader br = new BufferedReader(new InputStreamReader(in)); // 读取结果String lineStr = br.readLine(); //直接赋值
这本身可能不算问题哈,但是难为了我小半天,做个记录。以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- parallels|parallels desktop 解决网络初始化失败问题
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- Spark|Spark 数据倾斜及其解决方案
- 解决SyntaxError:|解决SyntaxError: invalid syntax
- Spectrum|Spectrum 区块偶尔停止同步问题排查与解决笔记
- 一劳永逸地解决词汇量不够的问题
- Hexo代码块前后空白行问题