java.io.IOException:通过https下载pdf时过早出现EOF
我在尝试用java下载pdf时出错。我知道也有类似的问题,但没有我的问题具体 我的代码片段:java.io.IOException:通过https下载pdf时过早出现EOF,java,http,io,stream,Java,Http,Io,Stream,我在尝试用java下载pdf时出错。我知道也有类似的问题,但没有我的问题具体 我的代码片段: URL url = new URL("https://.../abc.pdf"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); ... InputStream in= conn.getInputStream(); ByteArrayOutputStream out = new ByteArrayOutputStr
URL url = new URL("https://.../abc.pdf");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
...
InputStream in= conn.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
byte[] buf = new byte[4096];
int bytesRead = 0;
while ((bytesRead = in.read(buf)) != -1) {
out.write(buf, 0, bytesRead);
}
服务器响应头:
X-AspNet-Version:2.0.50727
Transfer-Encoding:chunked
Date:Thu 26 Apr 2012 12:07:59 GMT
Content-Disposition:attachment; filename=abc.pdf
Set-Cookie:Language=en-gb; path=/
Connection:Keep-Alive
Content-Type:application/octet-stream
Server:Microsoft-IIS/6.0
X-Powered-By:ASP.NET
Cache-Control:private
in.readbuf中的异常:
该代码几乎适用于所有情况,并已被使用数千次。但在极少数情况下,我会得到这个例外。但是我可以用浏览器下载pdf。此外,如果我把pdf放在自己的服务器上,我可以用我的代码下载它。因此,它必须与服务器提供此pdf的方式有关
也许这与传输编码有关:分块
有人知道我能做些什么来修复这个问题吗?这似乎是一个与java分块处理相关的错误。许多问题通过一次读取一个字节并将读取的内容放入EOFException的try catch中来解决。这似乎是一个与java分块处理相关的错误。许多问题是通过一次读取一个字节并将读取的内容放入EOFException的try catch中来解决的。我认为您应该需要这段代码
try {
}catch(IOException e) {
} finally {
try {
if (in != null)
in.close();
}catch(Exception e) {
}
}
或者尝试在Apache库中使用IOUtils.close
finally {
IOUtils.close(in);
}
我也有同样的经历。但现在已修复。我认为您应该需要此代码
try {
}catch(IOException e) {
} finally {
try {
if (in != null)
in.close();
}catch(Exception e) {
}
}
或者尝试在Apache库中使用IOUtils.close
finally {
IOUtils.close(in);
}
我也有同样的经历。但现在已修复。我刚刚尝试将缓冲区大小设置为1:byte[]buf=new byte[1];但同样的例外也发生了。现在我将尝试try-catch。如果忽略异常,它实际上是有效的,流仍然是满载的。即使有更大的缓冲。谢谢你的提示!如果缓冲区不是1,您认为在某些情况下可能会导致问题吗?我可以依赖忽略异常吗?如果错误只发生在第一个块中,我想:没问题,忽略异常就行了。总的来说:是的。好的,谢谢!我添加了另一个条件以确保只忽略这种情况:e.getMessage.equalsPremature EOF&&e.getStackTrace.length>0&&e.getStackTrace[0]。toString.indexOfsun.net.www.http.ChunkedInputStream.readAheadBlocking>=0I刚刚尝试将缓冲区大小设置为1:byte[]buf=new byte[1];但同样的例外也发生了。现在我将尝试try-catch。如果忽略异常,它实际上是有效的,流仍然是满载的。即使有更大的缓冲。谢谢你的提示!如果缓冲区不是1,您认为在某些情况下可能会导致问题吗?我可以依赖忽略异常吗?如果错误只发生在第一个块中,我想:没问题,忽略异常就行了。总的来说:是的。好的,谢谢!我添加了另一个条件以确保只忽略这种情况:e.getMessage.equalsPremature EOF&&e.getStackTrace.length>0&&e.getStackTrace[0]。toString.indexOfsun.net.www.http.ChunkedInputStream.readAheadBlocking>=0