繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM