Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取输入流“;停止“;线程进程_Java_Multithreading_Httprequest_Inputstream - Fatal编程技术网

Java 读取输入流“;停止“;线程进程

Java 读取输入流“;停止“;线程进程,java,multithreading,httprequest,inputstream,Java,Multithreading,Httprequest,Inputstream,在指控重复之前,请先阅读问题 我有一个启动多个线程的web应用程序,每个线程需要读取各种输入流,将它们解析为字符串,以提取信息。 该流来自org.apache.http.HttpResponse: response.getEntity().getContent(); 我实现了以下接收InputStream的代码: int len, size = 1024; byte[] buf; ByteArrayOutputStream bos = new ByteArrayOut

在指控重复之前,请先阅读问题

我有一个启动多个线程的web应用程序,每个线程需要读取各种
输入流
,将它们解析为
字符串
,以提取信息。 该流来自org.apache.http.HttpResponse:

response.getEntity().getContent();
我实现了以下接收InputStream的代码:

    int len, size = 1024;
    byte[] buf;

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    buf = new byte[size];
    while ((len = is.read(buf, 0, size)) != -1)
        bos.write(buf, 0, len);

    return bos.toString(encode);
出于某种原因,此方法只是停止处理,并且显然没有完成对流的读取。因此,线程永远不会结束,并且还会阻止其他线程执行。另一方面,web应用程序保持接受新请求(新线程)的“活动”。此外,只有在本地运行时才会发生这种情况,而不是在应用程序正在运行的生产服务器上(幸运吗?)

出于测试目的,我更改了方法:

    // ...
    System.out.println("\n=------------------------------");
    while (true) {
        len = is.read(buf, 0, size);
        System.out.print(len);
        if (len == -1)
            break;
        bos.write(buf, 0, len);
        System.out.print(" ");
    }
    System.out.println("\n=------------------------------");
    // ...
产生了:

[...]
=------------------------------ 
1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 1024 1024 1024 1024 305 1024 404 1024 404 1024 216 1024 404 1024 404 1024 216 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 131 -1 
=------------------------------

=------------------------------ 
1024 404 1024 404 1024 216 1024 404 1024 404 1024 404 1024 404 1024 404 1024 28 1024 404 1024 404 1024 404 1024 22 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 1024 404 
最后有一个空格,这意味着该方法停止在第
len=is.read(buf,0,size)行。没有引发异常(我被一个try-catch块包围,捕获一个
可丢弃的

这种行为是随机的,这意味着相同的流(可能不完全相同,但来自相同的请求url)可能会或可能不会导致错误。重新启动应用程序和线程,我可以执行一些以前失败的线程,直到问题迟早再次出现

在阅读其他StackOverflow的问题时,有人指出了一个
BufferedInputStream
,因此我改变了:

    BufferedInputStream buffIs = new BufferedInputStream(is);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    buf = new byte[size];
    while (true) {
        len = buffIs.read(buf);
        if (len == -1)
            break;
        bos.write(buf, 0, len);
    }

    return bos.toString();
这几乎解决了问题,我可以毫无困难地执行各种线程,但错误仍然存在

我也阅读和阅读。但是环境和输出是不同的,因为我需要提取生成的
字符串的信息
,设置包装超时函数似乎不是一个好的选择,因为我不会拥有流的全部内容,并且可能会丢失一些好的信息

你知道为什么会这样吗?我被困在这个问题上,没能想出一个合适的解决方案

[编辑]
在这之前,我使用的是
IOUtils.toString(inputStream,“ISO-8859-1”)
,bug就是从这里开始的,我试图实现自己的方法

--

很抱歉拼写错误,请随时更正。

在第三个代码列表中,您没有更新
len
。这是打字错误吗?您的测试服务器有问题。它没有关闭连接,或者IIt误报了内容长度。