GVKun编程网logo

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

17

针对java.io.EOFException:读取流数据期间ZLIB输入流意外结束和输入流读取文件这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展android–Retrofit2错误jav

针对java.io.EOFException:读取流数据期间 ZLIB 输入流意外结束输入流读取文件这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展android – Retrofit2错误java.io.EOFException:第1行第1列的输入结束、android-获取java.io.IOException:读取失败,套接字可能关闭或超时,通过蓝牙打印机打印时读取ret:-1、DataOutputSteam给我一个’java.io.IOException:意外的流结束’?、fastdfs文件上传报错Save file error:java.io.IOException: java.io.IOException: java.io.IOException: recv package size -1 != 10等相关知识,希望可以帮助到你。

本文目录一览:

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

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

如何解决java.io.EOFException:读取流数据期间 ZLIB 输入流意外结束?

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

使用的JDK:1.8

例外

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

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 堆栈截断流。

也有可能是因为客户端读取请求太慢,或者遇到错误,服务器已经“放弃”了请求。这些事情中的任何一个都可能是由于客户端(或多个客户端)通过请求使服务器过载。但如果是这样,解决方案仍然必须在服务器端;例如减少服务器端工作线程的数量,以便服务器更好地处理过载。

android – Retrofit2错误java.io.EOFException:第1行第1列的输入结束

android – Retrofit2错误java.io.EOFException:第1行第1列的输入结束

我使用Retrofit2调用了PATCH Web服务但是没有调用onResponse而且调用了onFailure尽管服务的操作在服务器端完成了

无论何时,我都试图使用fiddler来检查它的工作,我发现问题是序列化即将到来的服务响应,当使用fiddler时,我发现没有JSON响应的内容,所以Retrofit服务认为它失败了,因为没有内容,也无法序列化EMPTY内容
并给我这个错误

java.io.EOFException: End of input at line 1 column 1

提琴手原始回应

HTTP/1.1 200 OK
Server: Nginx/1.9.4
Date: Wed, 02 Mar 2016 09:55:55 GMT
Content-Type: application/json
Content-Length: 0
Connection: close
Status: 200 OK
X-Content-Type-Options: nosniff

fiddler Json的回应是空的

java中的webservice

Call<Object> call = TimeCapp.services.accept_invited_alerts(HomeActivity.api_token, alert_id);

call.enqueue(new Callback<Object>()
{
    @Override
    public void onResponse (Call<Object> call, Response<Object> response)
    {
        if (response.isSuccess()) {
            String x = response.body();
        }
    }
    @Override
    public void onFailure (Call<Object>call, Throwable t)
    {
        String x = t.getMessage();//java.io.EOFException: End of input at line 1 column 1
    }
}

我试图用String,JsonObject,emptyCalssBody替换对象….但它失败了

webservice的接口

@PATCH("alerts/{alert_id}/accept")
Call<Object> accept_invited_alerts(@Header("X-Api-Token") String  
api_token, @Path("alert_id") int alert_id);

解决方法:

如果正文为空,则返回void

@PATCH("alerts/{alert_id}/accept") Call<Void> accept_invited_alerts(@Header("X-Api-Token") String api_token, @Path("alert_id") int alert_id);

对于使用Rx java进行改造,你可以使用这样的东西

@PATCH("alerts/{alert_id}/accept") Observable<Response<Void>> accept_invited_alerts(@Header("X-Api-Token") String api_token, @Path("alert_id") int alert_id);

android-获取java.io.IOException:读取失败,套接字可能关闭或超时,通过蓝牙打印机打印时读取ret:-1

android-获取java.io.IOException:读取失败,套接字可能关闭或超时,通过蓝牙打印机打印时读取ret:-1

代码仅在第一次正常运行,如果我尝试再次连接它,则会引发此异常:

read Failed, socket might closed or timeout, read ret: -1

这是我用于连接蓝牙打印机的功能:

public boolean openBT(Context context) throws IOException {
    try {
        // Standard SerialPortService ID
        UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
        mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
        mBluetoothAdapter.canceldiscovery();

        mmSocket.connect();

        mmOutputStream = new DataOutputStream(mmSocket.getoutputStream());
        mmInputStream = new DataInputStream(mmSocket.getInputStream());


    } catch (NullPointerException e) {
        e.printstacktrace();
        return false;
    } catch (Exception e) { 
         e.printstacktrace();
        return false;

    }

    return true;

}

解决方法:

使用后,应关闭套接字:

public boolean openBT(Context context) throws IOException {
try {
    // Standard SerialPortService ID
    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
    mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
    mBluetoothAdapter.canceldiscovery();

    mmSocket.connect();

    mmOutputStream = new DataOutputStream(mmSocket.getoutputStream());
    mmInputStream = new DataInputStream(mmSocket.getInputStream());

    mmSocket.close(); //Socket closed
} catch (NullPointerException e) {
    e.printstacktrace();
    return false;
} catch (Exception e) { 
     e.printstacktrace();
    return false;

}

return true;}

DataOutputSteam给我一个’java.io.IOException:意外的流结束’?

DataOutputSteam给我一个’java.io.IOException:意外的流结束’?

我正在尝试使用HttpUrlConnection从 Android应用程序发出请求到WebService.但有时候它有效,有时它不起作用.

当我尝试发送此值:

JSON值

{"Calle":"Calle Pérez 105","DetalleDireccion":"","HoraPartida":"May 18,2014 9:17:10 AM","Numero":0,"PuntoPartidaLat":18.477295994621315,"PuntoPartidaLon":-69.93638522922993,"Sector":"Main Sector"}

我在DataOutputStream关闭函数中有一个“意外的流结束”异常.

这是我的代码:

DataOutputStream printout;
// String json;
byte[] bytes;
DataInputStream input;

URL serverUrl = null;
try {
    serverUrl = new URL(Config.APP_SERVER_URL + URL);
} catch (MalformedURLException e) {
    ...
} 

bytes = json.getBytes();
try {

    httpCon = (HttpURLConnection) serverUrl.openConnection();
    httpCon.setDoOutput(true);
    httpCon.setUseCaches(false);
    httpCon.setFixedLengthStreamingMode(bytes.length);
    httpCon.setRequestProperty("Authorization",tokenType + " "+ accesstoken);
    httpCon.setRequestMethod("POST");
    httpCon.setRequestProperty("Content-Type","application/json");

    printout = new DataOutputStream(httpCon.getoutputStream());
    printout.writeBytes(json);
    printout.flush();
    printout.close();
    ...
}

解决方法

以下是以下更改的解决方案:

它摆脱了DataOutputStream,这当然是错误的使用.
>它正确设置和传递内容长度.
>它不依赖于关于编码的任何默认值,而是在两个位置显式设置UTF-8.

尝试一下:

// String json;

URL serverUrl = null;
try {
    serverUrl = new URL(Config.APP_SERVER_URL + URL);
} catch (MalformedURLException e) {
    ...
} 

try {
    byte[] bytes = json.getBytes("UTF-8");

    httpCon = (HttpURLConnection) serverUrl.openConnection();
    httpCon.setDoOutput(true);
    httpCon.setUseCaches(false);
    httpCon.setFixedLengthStreamingMode(bytes.length);
    httpCon.setRequestProperty("Authorization","application/json; charset=UTF-8");

    OutputStream os = httpCon.getoutputStream();
    os.write(bytes);
    os.close();

    ...
}

fastdfs文件上传报错Save file error:java.io.IOException: java.io.IOException: java.io.IOException: recv package size -1 != 10

fastdfs文件上传报错Save file error:java.io.IOException: java.io.IOException: java.io.IOException: recv package size -1 != 10

这是什么原因?文件好像也能上传

关于java.io.EOFException:读取流数据期间 ZLIB 输入流意外结束输入流读取文件的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android – Retrofit2错误java.io.EOFException:第1行第1列的输入结束、android-获取java.io.IOException:读取失败,套接字可能关闭或超时,通过蓝牙打印机打印时读取ret:-1、DataOutputSteam给我一个’java.io.IOException:意外的流结束’?、fastdfs文件上传报错Save file error:java.io.IOException: java.io.IOException: java.io.IOException: recv package size -1 != 10等相关内容,可以在本站寻找。

本文标签: