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

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

(0)

相关推荐

  • Java中BufferedReader与BufferedWriter类的使用示例

    BufferedReader BufferedReader 是缓冲字符输入流.它继承于Reader. BufferedReader 的作用是为其他字符输入流添加一些缓冲功能. 创建BufferReader时,我们会通过它的构造函数指定某个Reader为参数.BufferReader会将该Reader中的数据分批读取,每次读取一部分到缓冲中:操作完缓冲中的这部分数据之后,再从Reader中读取下一部分的数据. 为什么需要缓冲呢?原因很简单,效率问题!缓冲中的数据实际上是保存在内存中,而原始数据可能

  • 基于自定义BufferedReader中的read和readLine方法

    实例如下所示: package day0208; import java.io.FileReader; import java.io.IOException; /* * 自定义读取缓冲区,实现BufferedReader功能 * 分析: * 缓冲区就是封装了一个数组,并对外提供了更多的方法对数组进行访问 * 其实这些方法最终操作的都是数组的角标 * 缓冲的原理: * 其实就是从源中获取一批数据装进缓冲区,再从缓冲区取出数据 * 当此次取完后,继续从源中取出一批数据到缓冲区 * 当源中的数据取光时

  • 自定义BufferedReader的实例

    缓冲区的建立目的就是增加传输性能,使我们传输数据更加快速 缓冲区的内部其实很简单 就是在内部封装了一个数组 用数组来存储数据 对外提供一些方法对数组进行访问 其中这些方法的操作就是对数组的指针(角标). 缓冲区的原理:从源中获取一批数据到缓冲区,再从缓冲区中一个一个取出 取完后用-1作为结束标记 在BufferedReader中我们读取数据方法有read() ,readLine() read() 其参数为char[],cbuf,int off,int len.其返回值为-1 readLine()

  • InputStreamReader和BufferedReader用法及实例讲解

    一.BufferedReader类 . 所属类库: java.lang.Object java.io.Reader java.io.BufferedReader . 基本概念 : public class BufferedReader    extends Reader 从字符输入流中读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值足够大. 通常, Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取

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

    bufferedReader.readLine()读到最后发生阻塞 最近在做一个imageserver,需求简化后就是使用socket响应HTTP请求从而截取所需要的数据流,写入到服务器端的文件中,从而完成客户端将图片上传到服务器. 因为从客户端得到的数据流中,我们只希望截取其中的一部分.这样就使我们无法像经常那样边读边向文件中写入,而且在流已经读到末尾时,使用bufferedInputStream.read()>0或inputStream.read()>0作为while语句结束的判断条件在使

  • 解决BufferedReader.readLine()遇见的坑

    目录 BufferedReader.readLine()遇见的坑 今天踩了这个坑,所以做个笔记 所以使用readLine()一定要注意 BufferedReader.readLine解析 BufferedReader.readLine()遇见的坑 在写ftp上传文件至服务器的过程中,有这样一个判断:判断某个文件夹下有多少个文件,内容为null的文件不上传,所以利用BufferedReader读取文件的内容,判断是否为null,所以用到了BufferedReader.readLine(),结果竟然

  • Java IO及BufferedReader.readline()出现的Bug

    目录 Java IO及BufferedReader.readline()的Bug IO流 BufferedReader.readline()方法Bug 源码 使用BufferReader类的readLine()方法注意问题 一.BufferReader类的readLine()方法 二.DataInputStream类的readUTF()方法 Java IO及BufferedReader.readline()的Bug IO流 流:流是一组有序的,有起点和终点的字节集合,是对计算机中数据传输的总称.

  • 如何使用BufferedReader循环读文件

    使用BufferedReader(缓存读取流)可以每次读取文件的一行.对于文件内容如果是按行为单位排列的话,则使用BufferedReader来读取文件还是比较方便的. 举例如下 1.BufferedReader读取一行 在F盘下有个txt文件,文件内容为 import java.io.*; public class test { public static void main(String[] args) { BufferedReader br = null; try { br = new B

  • Java 的 FileFilter文件过滤与readline读行操作实例代码

    复制代码 代码如下: package com.cjonline.foundation.evisa; import java.io.BufferedReader;import java.io.File;import java.io.FileFilter;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.math.BigDecimal; publ

  • 解决Python httpx 运行过程中无限阻塞的问题

    目录 Python httpx 运行过程中无限阻塞 1.通过 pm2 部署脚本 2.通过装饰器给函数设置一个最大执行超时时间 python爬虫httpx的用法 请求方式 Python httpx 运行过程中无限阻塞 requests 模块只支持 http1,在遇到 http2 的数据接口的时候(某乎的搜索接口),需要采用支持http2 请求的模块(如 httpx.hyper). 本文是针对 httpx 在请求数据时,出现无限阻塞问题的一些处理方法. httpx 的 timeout 有 bug,会

  • 解决Process.getInputStream()阻塞的问题

    Process.getInputStream()阻塞问题 Java中 Runtime.getInstance().exec (String cmd) 或者 new ProcessBuilder(String cmd).start() 都可以产生子进程对象Process.通过调用Process对象的waitFor()方法可以使主进程进入等待状态,直至子进程执行完毕,再进行下一步工作.如果对子进程处理不当,有可能造成主进程阻塞,整个程序死掉. java Api中关于Process说的是: Proce

  • C#使用读写锁三行代码简单解决多线程并发的问题

    在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件. 选择最后一种方法实现的时候,若对文件操作与线程同步不熟悉,问题就有可能出现了,因为同一个文件并不允许多个线程同时写入,否则会提示"文件正在由另一进程使用,因此该进程无法访问此文件". 这是文件的并发写入问题,就需要用到线程同步.而微软也给线程同步提供了一些相关的类可以达到这样的目的,本文使用到的 System.Thr

  • 如何解决TCP socket的阻塞问题

    目录 解决TCP socket的阻塞问题 在异常处理程序当中退出socket连接 TCP连接阻塞的监控和处理 我们整理出符合该类异常的特征如下 如何查看一个连接的创建时间 解决TCP socket的阻塞问题 大家知道,tcp的读和写是阻塞的,即读的时候不知道什么时候读完,写的时候不知道什么时候写完,因此线程就一直暂停在哪里,一般tcp程序用在上位机下位机之间对吧! 下位机一些设备一般会发心跳报文给我们机器,假设为10s发一次吧,当机器超过10s没接收到数据,那么我们就要考虑把socket断开,因

  • 如何解决TCP socket的阻塞问题

    目录 解决TCP socket的阻塞问题 在异常处理程序当中退出socket连接 TCP连接阻塞的监控和处理 我们整理出符合该类异常的特征如下 如何查看一个连接的创建时间 解决TCP socket的阻塞问题 大家知道,tcp的读和写是阻塞的,即读的时候不知道什么时候读完,写的时候不知道什么时候写完,因此线程就一直暂停在哪里,一般tcp程序用在上位机下位机之间对吧! 下位机一些设备一般会发心跳报文给我们机器,假设为10s发一次吧,当机器超过10s没接收到数据,那么我们就要考虑把socket断开,因

随机推荐