[英]String created from inputStream is not equal to its string literal
我正在从这样的套接字构造一个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
我什至进行了测试,以查看使用此实现的字符串之间的区别: http : //www.java2s.com/Tutorial/Java/0040__Data-Type/Getthedifferencebetweentwostrings.htm
它告诉我每个子字符串(字符)都不同。
我糊涂了。
首先,你的
while(noCharsLeft != -1) {
会循环超过您想要的次数。 它开始于0
,所以进行迭代,读取一些字符( noCharsLeft
被设置为一些正值),并检查while
一次。 它仍然不是== -1
,因此再次进行迭代。 这次,它不将任何字符读入缓冲区,而是写入StringBuilder
。 您需要先读取一次,然后再检查读取的字节数。
第二,
cbuf.toString()
返回一个从缓冲区当前位置开始的String
,该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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.