33

这真的是一个好奇心而不是一个问题......

为什么Scanner类没有nextChar()方法?next当您考虑它具有,nextIntnextLine方法的事实时,它似乎应该这样做。

我意识到您可以简单地执行以下操作:

userChar = in.next().charAt(0);
System.out.println( userChar  );

但是为什么没有nextChar()方法呢?

4

5 回答 5

15

原因是 Scanner 类是为读取空格分隔的标记而设计的。这是一个包装底层输入流的便利类。在扫描仪之前,您所能做的就是读取单个字节,如果您想读取单词或行,那将是一个很大的痛苦。使用 Scanner,您可以传入 System.in,它会执行许多 read() 操作来为您标记输入。读取单个字符是更基本的操作。 资源

您可以使用(char) System.in.read();.

于 2013-09-11T16:20:46.397 回答
4

根据javadoc,aScanner似乎不适合读取单个字符。您将 a 附加ScannerInputStream(或其他),它会为您解析输入。它还可以去除不需要的字符。因此,您可以轻松读取数字、线条等。例如,当您只需要输入中的字符时,请使用InputStreamReader

于 2013-09-11T16:19:30.003 回答
2

要获得明确的原因,您需要询问该 API 的设计者。

但一个可能的原因是(假设的)a 的意图nextChar不太适合扫描模型。

  • 如果nextChar()to 表现得像read()aReader并且只是从扫描仪返回下一个未使用的字符,那么它的行为与其他next<Type>方法不一致。它们在尝试解析值之前会跳过分隔符。

  • 如果nextChar()表现得像(说)nextInt那么:

    • 对于某些人来说,分隔符跳过将是“意外的”,并且

    • 存在的问题是它是否应该接受单个“原始”字符,或者是数字表示的数字序列 a char,或者甚至可能支持转义或其他东西1

不管他们做出怎样的选择,有些人都不会高兴。我的猜测是设计师决定远离沥青坑。


1 - 强烈支持原始字符方法......但关键是有需要分析的替代方案等。

于 2013-09-11T16:35:36.290 回答
1

Scanner 类基于 Stringnext(Pattern)方法中实现的逻辑。额外的 API 方法,如nextDouble()or nextFloat()。提供里面的图案。

然后类描述说

一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。

Scanner 使用分隔符模式将其输入分解为标记,默认情况下匹配空格。然后可以使用各种 next 方法将生成的标记转换为不同类型的值。

从描述来看,有人忘记了 char 可能会很遗憾,因为它肯定是一种原始类型。

但是类的概念是寻找模式,一个没有模式的字符就是下一个字符。恕我直言,这个逻辑导致 nextChar 没有实现。

如果您需要按字符读取归档的字符,则可以使用更高效的类。

于 2013-09-11T16:22:02.960 回答
1

我想这与编码有关。Achar是 16 个字节,一些编码会使用一个字节来表示一个字符,而另一种编码会使用两个甚至更多。最初设计 Java 时,他们假设任何 Unicode 字符都可以容纳 2 个字节,而现在一个 Unicode 字符最多需要 4 个字节(UTF-32)。无法Scanner在单个char.

您可以在构造实例时指定编码Scanner,如果未提供,它将使用平台字符集。但这仍然不能处理 3 或 4 字节 Unicode 字符的问题,因为它们不能表示为单个char基元(因为char只有 16 个字节)。所以你最终会得到不一致的结果。

于 2013-09-11T16:23:23.833 回答