从inputStream创建的字符串不等于其字符串文字

时间:2014-10-25 23:54:52

标签: java string

我正在从这样的套接字构造一个String:

        StringBuilder bufferedStringInput = new StringBuilder(); 
        CharBuffer cbuf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE);

        InputStream is = clientSocket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        int noCharsLeft = 0;
        while(noCharsLeft != -1) {
            noCharsLeft = br.read(cbuf);
            bufferedStringInput.append(cbuf.toString());
            cbuf.clear();
        }

然后我将其toString值传递给方法,将其与字符串进行比较。 当我输出两者时它们完全相同;在我的情况下,字符串是“READ”:

System.out.println(inputString+READ)给了我:READREAD

我甚至测试过看看Strings之间使用此实现的区别:http://www.java2s.com/Tutorial/Java/0040__Data-Type/Getthedifferencebetweentwostrings.htm

它告诉我每个子串(字符)都不同。

我很困惑。

1 个答案:

答案 0 :(得分:2)

一个,你的

while(noCharsLeft != -1) {

会比你想要的更多循环。它从0开始,因此迭代,读取一些字符(noCharsLeft设置为某个正值),然后再次检查while。它仍然不是== -1,因此再次迭代。这次它不会在缓冲区中读取任何字符,而是写入StringBuilder。在检查读取的字节数之前,您需要读取一次。

其次,

cbuf.toString()

从缓冲区中的当前位置开始返回String,这比添加的最后一个字符多一个。也就是说,它包含DEFAULT_BUFFER_SIZE - noCharsLeft '\0'个字符。

忽略编码(您不应忽略编码,为InputStreamReader提供字符编码),您需要类似

的内容
while ((noCharsLeft = br.read(cbuf)) != -1) { 
    cbuf.rewind();
    bufferedStringInput.append(cbuf, 0, noCharsLeft);
    cbuf.clear();
}

在这里,您阅读了第一批字符。然后,回退缓冲区以将位置设置为索引0.然后,将缓冲区中的noCharsLeft个字符附加到StringBuilder