java.io.EOFException:读取流数据期间ZLIB输入流意外结束

java.io.EOFException:读取流数据期间ZLIB输入流意外结束,java,rest,gzip,restapi,gzipinputstream,Java,Rest,Gzip,Restapi,Gzipinputstream,下面的代码用于从API读取数据。来自API的数据流采用gzip编码。当命中单个API时,数据会正确到达,但当使用多线程同时命中几个API(不同)时,它会在下面代码中的reader.readLine()处抛出以下异常 JDK使用:1.8 异常: java.io.EOFException:ZLIB输入流意外结束 在java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)~[?:1.8.0191] url = new UR

下面的代码用于从API读取数据。来自API的数据流采用gzip编码。当命中单个API时,数据会正确到达,但当使用多线程同时命中几个API(不同)时,它会在下面代码中的reader.readLine()处抛出以下异常

JDK使用:1.8

异常

java.io.EOFException:ZLIB输入流意外结束 在java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)~[?:1.8.0191]

url = new URL(urlString);
                    urlConnection = (HttpURLConnection) url.openConnection();
    
                    if (urlConnection != null) {
                        //encoding
                        urlConnection.setConnectTimeout(5000);
                        urlConnection.setReadTimeout(0);
                        urlConnection.setRequestMethod("GET");
                        urlConnection.setRequestProperty("Authorization", "Basic " + encoded);
                        urlConnection.setRequestProperty("Accept-Encoding", "gzip");
    
                        urlResponseCode = urlConnection.getResponseCode();
                        if (urlResponseCode == HttpURLConnection.HTTP_OK) {
                            inputStream = urlConnection.getInputStream();
                            if (inputStream != null) {
                                if ("gzip".equalsIgnoreCase(urlConnection.getContentEncoding())) {
                                    reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(inputStream)));
                                } else {
                                    reader = new BufferedReader(new InputStreamReader(inputStream));
                                }
                                String line;
                                long mb = 1024 * 1024;
                                while ((line = reader.readLine()) != null) {
                                    //adding the line to a String Builder
                                }   
我知道有一些基于这个例外的stackoverflow文章,但它们是在不同的情况下出现的。所以,我问了这个问题

我也知道异常可以被捕获并向前移动。但这可能会导致数据丢失。因此,如果提供替代方法,效果会更好

这一例外的原因可能是什么

我也知道异常可以被捕获并向前移动。但这可能会导致数据丢失。因此,如果提供替代方法,效果会更好

除非我弄错了,否则你在客户端对此无能为力

问题是客户端代码正在读取的输入流已被截断

它可以是:

  • 服务器中的应用程序代码未正确关闭生成gzip数据的流。这可能导致最后一个块无法压缩和写入。(一个
    flush()
    是不够的。必须关闭
    GZIPOutputStream
    本身……假设压缩数据流就是这样生成的。)
  • 服务器在响应中设置了不正确的内容长度,导致客户端HTTP堆栈截断流

也可能是由于客户端读取请求太慢或遇到错误,服务器已“放弃”请求。这两种情况中的任何一种都可能是由于客户端(或多个客户端)使用请求重载服务器造成的。但如果是这样,解决方案仍然必须在服务器端;e、 g.减少服务器端工作线程的数量,以便服务器更好地处理过载。

服务器可能发送错误的内容长度。