我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

解决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();//然后在获取的

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

下面是修改了的:


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

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

免责声明:

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

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

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

解决MySQL读写分离导致insert后select不到数据的问题

MySQL设置独写分离,在代码中按照如下写法,可能会出现问题// 先录入 this.insert(obj); // 再查询 Object res = this.selectById(obj.getId()); res: null;线上的一
2022-05-28

axios发送post请求上传文件到后端的问题怎么解决

这篇“axios发送post请求上传文件到后端的问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“axios发送po
2023-06-30

解决MongoDB技术开发中遇到的读写性能问题的方法研究

解决MongoDB技术开发中遇到的读写性能问题的方法研究摘要:MongoDB是一个高性能的NoSQL数据库,但在实际开发中,由于数据量增大导致读写性能下降是常见的问题。本文将就MongoDB的读写性能问题展开研究,并提出解决方案,同时给出代
2023-10-22

Pygame出现播放背景音乐卡顿的问题分析及解决(发生在win10更新至win11后)

Windows11更新后,Pygame播放背景音乐出现卡顿问题。分析原因包括WASAPI默认启用、音频优先级调度更改和音频端点变更。解决方案包括禁用WASAPI、调整音频优先级、检查音频驱动程序、使用PygameMixer、调整缓存大小、混音音频、减小采样率、优化代码和禁用VSync。通过这些方法,可以优化音频播放并解决卡顿问题。
Pygame出现播放背景音乐卡顿的问题分析及解决(发生在win10更新至win11后)
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录