- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用了一些代码一段时间来从 Web 服务器获取数据,几个月前,我添加了压缩支持,这似乎对于“常规”HTTP 响应效果很好,其中整个文件包含在回复中。但是,当我使用 Range
header 时,它似乎不起作用。
这是真正起作用的代码:
InputStream in = null;
int bufferSize = 4096;
int responseCode = conn.getResponseCode();
boolean error = 5 == responseCode / 100
|| 4 == responseCode / 100;
int bytesRead = 0;
try
{
if(error)
in = conn.getErrorStream();
else
in = conn.getInputStream();
// Buffer the input
in = new BufferedInputStream(in);
// Handle compressed responses
if("gzip".equalsIgnoreCase(conn.getHeaderField("Content-Encoding")))
in = new GZIPInputStream(in);
else if("deflate".equalsIgnoreCase(conn.getHeaderField("Content-Encoding")))
in = new InflaterInputStream(in, new Inflater(true));
int n;
byte[] buffer = new byte[bufferSize];
// Now, just write out all the bytes
while(-1 != (n = in.read(buffer)))
{
bytesRead += n;
out.write(buffer, 0, n);
}
}
catch (IOException ioe)
{
System.err.println("Got IOException after reading " + bytesRead + " bytes");
throw ioe;
}
finally
{
if(null != in) try { in.close(); }
catch (IOException ioe)
{
System.err.println("Could not close InputStream");
ioe.printStackTrace();
}
}
点击带有标题的 URL Accept-Encoding: gzip,deflate,identity
效果非常好:我可以看到服务器以压缩格式返回数据,上面的代码将其解压缩很好。
如果我随后添加 Range: bytes=0-50
header ,则会出现以下异常:
Got IOException after reading 0 bytes
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:116)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at [my code]([my code]:511)
我的代码中的
第 511
行是包含 in.read()
调用的行。响应包含以下 header :
Content-Type: text/html
Content-Encoding: gzip
Content-Range: bytes 0-50/751
Content-Length: 51
我已经验证,如果我不尝试解压缩响应,我实际上会在响应中得到 51 个字节......这不是服务器故障(至少我可以这么说)。我的服务器(Apache httpd)不支持“deflate”,所以我无法测试其他压缩方案(至少现在不能)。
我还尝试请求更多数据(例如目标资源中总共 751 字节中的 700 字节),但我得到了同样类型的错误。
我有什么遗漏吗?
更新抱歉,我忘记指出我正在 Linux 上使用 Apache/2.2.22。据我所知,没有任何服务器错误。我在验证从服务器检索的压缩字节时会遇到一些麻烦,因为“gzip”内容编码非常简单......例如我相信我不能只在命令行上使用“gunzip”来解压缩这些字节。不过我会尝试一下。
最佳答案
您可以使用“gunzip”来解压缩它,但请记住,前 50 个字节可能不足以让 gzip 解压缩任何内容( header 、字典等)。试试这个:wget -O- -q <URL> | head -c 50 | zcat
与您的 URL 一起查看正常的 gzip 在您的代码失败的地方是否有效。
关于java - 使用 "gzip" header 时,无法让 Java 的 GZIPInputStream 从服务器读取 "Range"响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18789597/
GZIP 的大小限制为 4GB,从 http://www.gzip.org/#faq10 获取上面的链接中提到了一些补丁,可以读取超过 4GB 的文件。 我正在使用 GZIPInputStream 读
我需要清楚地了解 GZIPInputstream 的工作原理。我创建了 FileInputStream 对象并将其传递给 GZIPInputstream 以读取我的 config.tar.gz 文件。
简而言之,问题是每当我添加 GZipInputStream 和 GZipOutputStream 时,我的数据就会损坏。没有它们,一切都可以正常工作。 我有以下代码: public boolean l
我在解压缩文件时遇到了一个奇怪的问题,我正在考虑为此使用字符集 UTF-8。我正在使用 Guava 库。 public static byte[] gzip(final CharSequence cs
我有一个包含拉丁文、西里尔文和中文字符的文本。我尝试使用 GZIPOutputStream 压缩字符串(通过 bytes[])并使用 GZIPInputStream 解压缩它。但我无法将所有角色转换回
我正在尝试将 HTTP 响应的 gzip 压缩正文转换为纯文本。我已获取此响应的字节数组并将其转换为 ByteArrayInputStream。然后我将其转换为 GZIPInputStream。我现在
我有一个 .gz 格式的文件。用于读取此文件的 java 类是 GZIPInputStream。但是,这个类并没有扩展 java 的 BufferedReader 类。结果,我无法逐行读取文件。我需要
我正在尝试使用 GZIPOutputStream 在客户端中对字符串进行编码,然后使用 GZIPOutputStream 在服务器中对字符串进行解码。 客户端代码(在初始套接字连接建立之后)是: //
我正在通过 GZIPInputStream 读取 gzip 压缩文件。我想一次读取大量数据,但无论我要求 GZIPInputStream 读取多少字节,它总是读取少得多的字节数。例如, val bAr
在下面的行中,当instream是GZIPInputStream时,我发现c的值是完全随机的,要么大于或小于1024。但是当instream是FileInputStream时,返回值始终是1024。
我在使用 SharpZipLib 的 GZipInputStream 编写未压缩的 GZIP 流时遇到问题。我似乎只能获得 256 字节的数据,其余数据未写入并归零。已检查压缩流 (compresse
我有一个奇怪的程序,其中缓冲区的 GzipInputStream 零填充部分。我有幸知道字节在流中应该是什么样子,我可以看到缓冲区中填充了 8 个正确的字节和 12 个零(不应为零) 字节应该像这样-
我正在尝试在 Java 中使用 GZIPInputStream 来解压缩来自 .NET 应用程序的图像数据(以 GZIP 格式压缩)。图像数据作为 base64 字符串传输,因为它作为 XML 文本同
作为引用,这是我收到的完整错误: java.io.EOFException: Unexpected end of ZLIB input stream at java.util.zip.Infl
场景是读取一个gzip文件(扩展名为.gz) 知道有 GZIPInputStream 类来处理这个。 这里是将文件对象转换为 GZIPStream 的代码。 FileInputStream fin =
我有一个从另一个 ByteArrayInputStream 构建的 GZIPInputStream。我想知道 gzip 数据的原始(未压缩)长度。虽然我可以读取到GZIPInputStream的末尾,
是否有任何适用于 J2ME 的 GZIPInputStream 实现。我更喜欢 Apache 样式许可证 最佳答案 IIRC phoneME project包括 GZIPInputStream 的实现
我正在尝试将一系列 Long 写入 GZIPOutputStream,希望稍后能解压缩这些数字。 当我尝试使用少量 Long 时,以下程序运行良好,但使用许多 Long 时会抛出异常,例如 (1024
我有一个静态辅助方法,负责从我们的 Rails 应用程序中获取压缩的 JSON 字符串,并在返回 String 表示之前解压缩数据。 我编写了两个 JUnit 测试,一个测试 JSON 是否正确解析,
我使用 Java BufferedReader 对象逐行读取指向有效 GZIP 存档的 GZIPInputStream,该存档包含 1,000 行 ASCII 文本,采用典型的 CSV 格式。代码如下
我是一名优秀的程序员,十分优秀!