解决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


猜你喜欢
- FileStream,顾名思义,文件流。流,是字节流。我的理解是,硬盘上存在一个字节流,内存里也有一个字节流,它们是对应的。程序运行时,我们
- 在C#中,用于存储的结构较多,如:DataTable,DataSet,List,Dictionary,Stack等
- 使用maven引入jar<dependency> <groupId>com.itextpdf</g
- 在使用AndroidNDK开发的时候有个事情是很烦人的,那就是创建本地代码文件夹,生成本地代码文件和创建本地代码的编译文件。特别是实现本地方
- 代码如果不进行格式化的处理,那么在查阅上会浪费不少的时间。今天我们要说的是字符串的格式化处理,作为基础编程内容,相信大家都字符串都不陌生。我
- 本文实例讲述了C#中static静态变量的用法。分享给大家供大家参考。具体如下:使用 static 修饰符声明属于类型本身而不是属于特定对象
- 本文实例讲述了C#数据结构之堆栈(Stack)。分享给大家供大家参考,具体如下:堆栈(Stack)最明显的特征就是“先进后出”,本质上讲堆栈
- 最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容。首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间
- 1.引入AOP依赖<dependency>
- 目录单一职责原则接口隔离原则开闭原则里氏替换原则依赖倒置原则迪米特法则笔者作为一个菜鸟,会尝试以简单的代码和容易理解的语句去解释这几种原则的
- 你以前听到的谈论关于Java8的所有都是围绕lambda表达式. 但它仅仅是Java8的一部分. Java 8 有许多新特性—一些强大的新类
- Java实现远程控制技术java自带的java.net.和java.awt.robot. 的混合可以用于实现通过网络对另一台计算机的远程控制
- 在程序中对文件进行压缩解压缩是很重要的功能,不仅能减小文件的体积,还能对文件起到保护作用。如果是生成用户可以下载的文件,还可以极大的减少网络
- 目录1、备份原数据库File文件2、数据库升级XML编写 updateXml.xml3、创建XML解析器3.1 对应工具类 DomUtils
- ActiveMQ是Apache的一个开源项目,它是一个功能强劲的开源消息总线,也是一个中间件产品,它是JMS的一个实现。在介绍ActiveM
- 水仙花数:水仙花数是三位数,它的各位数字的立方和等于这个三位数本身,例如:370=33+73+00;371=33+73+13,370、371
- 在写接口实现时,有时会有多个实现类。这篇文章介绍在调用时通过传入字符串来指定具体的实现类。一.接口与实现类:// 接口public inte
- 前言springmvc中有两种很普遍的AOP实现:1.过滤器(Filter)2. * (Interceptor)本篇面对的是一些刚接触spr
- 刚刚学习Android,用Gallery作了一个小demo,用来记录一下。package com.example.galleryex02;i
- 今天我们来讨论如何在项目开发中优雅地使用RocketMQ。本文分为三部分,第一部分实现SpringBoot与RocketMQ的整合,第二部分