针对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 输入流意外结束(输入流读取文件)
- 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 输入流意外结束?
以下代码用于从 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列的输入结束
我使用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
代码仅在第一次正常运行,如果我尝试再次连接它,则会引发此异常:
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:意外的流结束’?
当我尝试发送此值:
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
这是什么原因?文件好像也能上传
关于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等相关内容,可以在本站寻找。
本文标签: