要写一个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内容就不全了。    请问应该怎么解决这个问题!

解决方案 »

  1.   

    还是使用InputStream来读啊,自己来判断\r\n不就可以了
      

  2.   

    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?他的迭代还浪费了点性能咧,呵呵