我在压缩某些网站时遇到问题。以下代码应该可以正常工作,但会抛出EOFException
. 所有主流浏览器都可以加载该站点,我也可以使用 curl 和 gzip。
public static void main(String[] args) throws IOException {
URL url = new URL("http://www.ddanzi.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Accept-Encoding", "gzip");
System.out.println("Encoding: " + connection.getContentEncoding());
System.out.println("Bytes: " + IOUtils.toByteArray(new GZIPInputStream(connection.getInputStream())).length);
}
这将是输出:
Encoding: gzip
Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1792)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1769)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1744)
at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:462)
at Test.main(Test.java:18)
这不是我在 gzip 编码方面遇到问题的唯一网站。我也有问题
- 央视网
- yxdown.com
- 天气网
- 易奔网
难道我做错了什么?
我的系统是 Win7 x64,Java 8 Update 102。
提前致谢!
编辑:我可以自己读取流并吞下异常,但在异常发生的那一刻,我可能会丢失bufferSize字节并且有一个损坏/不完整的文档。有没有办法解决这个问题(将bufferSize设置为 1 除外)?
编辑2:作为一种在异常发生之前获取字节的解决方法,例如可以像这样读取流:
byte[] buffer = new byte[bufferSize];
InputStream inputStream = connection.getInputStream():
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
while(true) {
int read = inputStream.read(buffer);
if (read == -1) break;
baos.write(buffer, 0, read);
}
}catch(Exception e) {
// Just swallow or Log or something...
}
byte[] result = baos.toByteArray();
但这里的问题是,如何选择bufferSize?例如,当它设置为 1000 并且在某些时候,例如在读取当前 1000 个字节中的最后一个时发生异常,我将丢失之前正确读取的所有 999 个字节。完整性的完美值是 1,但这非常慢。
那么,如何在不损失性能的情况下获得所有正确的可读数据呢?