这真的是好奇心而不是问题...
为什么Scanner
类没有nextChar()
方法?当您考虑到它具有next
,nextInt
,nextLine
等方法时,它似乎应该是这样。
我意识到你可以简单地做到以下几点:
userChar = in.next().charAt(0);
System.out.println( userChar );
但为什么没有nextChar()
方法?
答案 0 :(得分:14)
原因是Scanner类设计用于以空格分隔的标记进行读取。它是一个包含底层输入流的便利类。在扫描仪之前你所能做的就是用单个字节读取,如果你想阅读单词或行,这是一个很大的痛苦。使用Scanner,您可以传入System.in,并执行许多read()操作来为您输入标记。读取单个字符是一项更基本的操作。 Source
您可以使用(char) System.in.read();
。
答案 1 :(得分:4)
根据javadoc,Scanner
似乎不是用于阅读单个字符。您将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 - 对原始角色方法投票强烈......但重点是有其他需要分析的替代方案等。