6

我正在尝试编写一个读取 HTTP 请求和响应并解析它们的类。由于标题是普通文本,使用BufferedReaderreadLine方法似乎最容易阅读它们。这显然不适用于数据主体,因为它可能是二进制的,所以我想在读取标头后切换到读取原始字节。

现在,我正在做这样的事情:

InputStream input=socket.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(input));
BufferedInputStream binstream=new BufferedInputStream(input);

问题是BufferedReader正在提前读取并吞噬流中的所有二进制数据,然后我才有机会使用 binstream 获取它。

有没有办法防止它在每次调用readLine时读取超出换行符的内容?或者有没有更好的方法来读取单行 ASCII 文本和原始二进制数据?

4

3 回答 3

5

Java 中已经有一个类用于处理 HTTP 请求和响应。您应该使用它而不是尝试自己解析响应。解析 HTTP 响应比您想象的要困难,因为您必须处理不同的编码方法。它不是响应负载中的真正原始二进制数据。HttpURLConnection 类将为您解析标头并为您提供有效负载的 InputStream。

http://download.oracle.com/javase/1.4.2/docs/api/java/net/HttpURLConnection.html

于 2011-02-15T00:21:29.273 回答
5

如果您不想使用 Konstantin 建议的现成的 HTTP 客户端/服务器实现,DataInputStream 有一个readLine方法。它已被弃用,因为它没有进行正确的转换(主要是直接字节 -> 字符转换),但我认为对于纯 ASCII 标题行你应该很好。

(您应该在 DataInputStream 下放置一个 BufferedInputStream,因为 readLine 会单独读取每个字节。)

于 2011-02-15T00:49:52.377 回答
2

commons-httpclient 可能会为您节省大量工作。

于 2011-02-15T01:11:08.823 回答