我正在从这样的套接字构造一个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
它告诉我每个子串(字符)都不同。
我很困惑。
答案 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
。