要写一个HTTP的Client程序,要求使用Socket。HTTP的Response从Socket中的InputStream中得到。问题在于:
InputStream的前面部分内容使用的是Unicode编码(Response中的Status Line和Header),后面的Entity内容可能是任何编码(比如二进制的图片文件或者mp3等,也可能是HTML的文本)。前后之间用一个“\r\n”空行隔开。
我本来是使用InoutStreamReader来读这个InputStream的,读到“\r\n”空行之后再直接读这个inputStream的二进制内容。可是发现InoutStreamReader已经自动地读到用来分开两部分的“\r\n”空行之后去了,也就是说它实际上迭代调用基础InputStream的read方法更多次,而不是只读到它返回给用户的那个字符那里。所以我当我再调用InputStream的read方法是得到的字节已经不是空行之后的第一个字节了。因此我的Client程序得到的Entity内容就不全了。 请问应该怎么解决这个问题!
InputStream的前面部分内容使用的是Unicode编码(Response中的Status Line和Header),后面的Entity内容可能是任何编码(比如二进制的图片文件或者mp3等,也可能是HTML的文本)。前后之间用一个“\r\n”空行隔开。
我本来是使用InoutStreamReader来读这个InputStream的,读到“\r\n”空行之后再直接读这个inputStream的二进制内容。可是发现InoutStreamReader已经自动地读到用来分开两部分的“\r\n”空行之后去了,也就是说它实际上迭代调用基础InputStream的read方法更多次,而不是只读到它返回给用户的那个字符那里。所以我当我再调用InputStream的read方法是得到的字节已经不是空行之后的第一个字节了。因此我的Client程序得到的Entity内容就不全了。 请问应该怎么解决这个问题!
private InputStream reader;//....你的类的其他处理部分//读取函数
private int read() throws IOException {
int b = reader.read();
if (skipLF) {
if (b == '\n') {
b = reader.read();
}
skipLF = false;
}
switch (b) {
case '\r':
skipLF = true;
case '\n': /* Fall through */
nextLine(); //下一行,当然你也可以用自己的行计数器
return '\n';
}
return b;
}
以上的代码,直接使用InputStream就可以了,何必要用其他的reader?他的迭代还浪费了点性能咧,呵呵