【问题标题】:Why doesn't StringReader.Read() return a byte?为什么 StringReader.Read() 不返回一个字节?
【发布时间】:2010-11-15 09:10:12
【问题描述】:

我在数据结构分配(霍夫曼代码)中使用 StringReader,并且正在测试是否已到达字符串的末尾。我发现 StringReader.read() 返回的 int 值不是 -1,而是 65535,因此将结果转换为字节解决了我遇到的无限循环问题。

这是 JDK 中的错误,还是将 Reader.read() 调用返回的值转换为字节的常见做法?还是我错过了什么?

我的代码的要点是这样的:

StringReader sr = new StringReader("This is a test string");
char c;
do {
    c = sr.read();
//} while (c != -1);     //<--Broken
} while ((byte)c != -1); //<--Works

【问题讨论】:

    标签: java char ascii byte stringreader


    【解决方案1】:

    事实上,它甚至无法编译。我明白了:

    类型不匹配:无法从 int 转换为 char

    由于sr.read() 调用返回int,我建议您将其存储为这样。

    这会编译(并按预期工作):

    StringReader sr = new StringReader("This is a test string");
    int i;               // <-- changed from char
    do {
        i = sr.read();
    
        // ... and if you need a char...
        char c = (char) i;
    
    } while (i != -1);   // <-- works :-)
    

    为什么 StringReader.Read() 不返回一个字节?

    字符串由 16 位 unicode 字符组成。这些不适合 8 位字节。有人可能会争辩说char 就足够了,但是没有空间提供已达到 EOF 的指示。

    【讨论】:

    • ` char c = (char) -1; System.out.println(c!=-1);` 为我编译
    • 如果你有一个变量char c(就像 OP 一样),那么 c = sr.read();(就像 OP 一样)将无法编译。
    • 字符串宽度问题是有道理的,我不得不改变我的递归方法的基本情况,我只是在没有强制转换为(字节)的情况下进行了测试,一切都很好>_
    • 哦,旁注,忘记投射为 char 是一个错字,对此感到抱歉。
    【解决方案2】:

    java 中的字符是 2 个字节,因为它们是用 UTF-16 编码的。这就是 read() 返回 int 的原因,因为 byte 不够大。

    【讨论】:

      【解决方案3】:
       char c = (char) -1;
              System.out.println(""+c);
              System.out.println(""+(byte)c);
      

      此代码将解决您的疑问..

      【讨论】:

        【解决方案4】:

        Java Stringchars 的序列,它们不是字节,而是代表 UTF-16 代码点的值。 read 的语义是从输入流中返回下一个 atom。在StringReader 的情况下,原子组件是一个 16 位值,不能表示为单个字节。

        【讨论】:

          【解决方案5】:

          StringReader#read 返回 int 值,如果已到达流的末尾,则为 -1

          您的代码中的问题是您已经将int 值转换为字符并测试字符:

          System.out.println("Is it still (-1)?: " + (int) ((char) -1));
          

          【讨论】:

            猜你喜欢
            • 2011-06-07
            • 2017-08-04
            • 1970-01-01
            • 1970-01-01
            • 2019-03-08
            • 1970-01-01
            • 1970-01-01
            • 2014-09-24
            相关资源
            最近更新 更多