Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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.io.IOException:通过https下载pdf时过早出现EOF_Java_Http_Io_Stream - Fatal编程技术网

java.io.IOException:通过https下载pdf时过早出现EOF

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

我在尝试用java下载pdf时出错。我知道也有类似的问题,但没有我的问题具体

我的代码片段:

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