为什么Scanner类没有nextChar方法?

时间:2013-09-11 16:09:07

标签: java

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

为什么Scanner类没有nextChar()方法?当您考虑到它具有nextnextIntnextLine等方法时,它似乎应该是这样。

我意识到你可以简单地做到以下几点:

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

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

5 个答案:

答案 0 :(得分:14)

  

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

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

答案 1 :(得分:4)

根据javadocScanner似乎不是用于阅读单个字符。您将Scanner附加到InputStream(或其他内容)并为您解析输入。它还可以删除不需要的字符。所以你可以轻松阅读数字,线条等。如果只需要输入中的字符,请使用InputStreamReader作为示例。

答案 2 :(得分:1)

Scanner类基于String next(Pattern)方法实现的逻辑。其他API方法,例如nextDouble()nextFloat()。提供内部模式。

然后上课description says

  

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

     

扫描仪使用分隔符模式将其输入分解为标记,   默认情况下匹配空格。然后可以得到所产生的令牌   使用各种下一个转换为不同类型的值   方法

从描述中可以感到遗憾的是,有人忘记了char,因为它确实是一种原始类型。

但是类的概念是找到模式,char没有模式只是下一个字符。而这个逻辑恕我直言导致nextChar尚未实施。

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

答案 3 :(得分:1)

我认为它与编码有关。 char是16个字节,一些编码将使用一个字节用于一个字符,而另一个将使用两个甚至更多。当最初设计Java时,他们假设任何Unicode字符都适合2个字节,而现在Unicode字符最多需要4个字节(UTF-32)。 Scanner无法在单个char中表示UTF-32代码点。

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

答案 4 :(得分:1)

要获得明确的理由,您需要向设计人员询问该API。

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

  • 如果nextChar()read()上表现得像Reader,并且只是从扫描仪返回了下一个未使用的字符,那么它与其他{{1}的行为不一致} 方法。这些字符在尝试解析值之前会跳过分隔符字符。

  • 如果next<Type>表现得像(比方说)nextChar()那么:

    • 对于某些人而言,分隔符跳过会“意外”,并且

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

无论他们做出什么选择,有些人都不会高兴。我的猜测是设计师决定远离防水布。


1 - 对原始角色方法投票强烈......但重点是有其他需要分析的替代方案等。