日期:2014-05-20  浏览次数:20784 次

Java的InputStream和Reader的问题,高手进,悬赏50分!
要写一个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内容就不全了。

        请问应该怎么解决这个问题!

------解决方案--------------------
帮顶!
------解决方案--------------------
学习下,帮顶。。
------解决方案--------------------
关注
------解决方案--------------------
我也不会,帮顶一下,等待高手~~~
------解决方案--------------------
不会啊
------解决方案--------------------
wait for expert。。。。。。。。。。。。
------解决方案--------------------
还是使用InputStream来读啊,自己来判断\r\n不就可以了
------解决方案--------------------
private boolean skipLF;
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?他的迭代还浪费了点性能咧,呵呵