这真的是一个好奇心而不是一个问题......
为什么Scanner
类没有nextChar()
方法?next
当您考虑它具有,nextInt
等nextLine
方法的事实时,它似乎应该这样做。
我意识到您可以简单地执行以下操作:
userChar = in.next().charAt(0);
System.out.println( userChar );
但是为什么没有nextChar()
方法呢?
这真的是一个好奇心而不是一个问题......
为什么Scanner
类没有nextChar()
方法?next
当您考虑它具有,nextInt
等nextLine
方法的事实时,它似乎应该这样做。
我意识到您可以简单地执行以下操作:
userChar = in.next().charAt(0);
System.out.println( userChar );
但是为什么没有nextChar()
方法呢?
原因是 Scanner 类是为读取空格分隔的标记而设计的。这是一个包装底层输入流的便利类。在扫描仪之前,您所能做的就是读取单个字节,如果您想读取单词或行,那将是一个很大的痛苦。使用 Scanner,您可以传入 System.in,它会执行许多 read() 操作来为您标记输入。读取单个字符是更基本的操作。 资源
您可以使用(char) System.in.read();
.
根据javadoc,aScanner
似乎不适合读取单个字符。您将 a 附加Scanner
到InputStream
(或其他),它会为您解析输入。它还可以去除不需要的字符。因此,您可以轻松读取数字、线条等。例如,当您只需要输入中的字符时,请使用InputStreamReader。
要获得明确的原因,您需要询问该 API 的设计者。
但一个可能的原因是(假设的)a 的意图nextChar
不太适合扫描模型。
如果nextChar()
to 表现得像read()
aReader
并且只是从扫描仪返回下一个未使用的字符,那么它的行为与其他next<Type>
方法不一致。它们在尝试解析值之前会跳过分隔符。
如果nextChar()
表现得像(说)nextInt
那么:
对于某些人来说,分隔符跳过将是“意外的”,并且
存在的问题是它是否应该接受单个“原始”字符,或者是数字表示的数字序列 a char
,或者甚至可能支持转义或其他东西1。
不管他们做出怎样的选择,有些人都不会高兴。我的猜测是设计师决定远离沥青坑。
1 - 强烈支持原始字符方法......但关键是有需要分析的替代方案等。
Scanner 类基于 Stringnext(Pattern)
方法中实现的逻辑。额外的 API 方法,如nextDouble()
or nextFloat()
。提供里面的图案。
然后类描述说:
一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。
Scanner 使用分隔符模式将其输入分解为标记,默认情况下匹配空格。然后可以使用各种 next 方法将生成的标记转换为不同类型的值。
从描述来看,有人忘记了 char 可能会很遗憾,因为它肯定是一种原始类型。
但是类的概念是寻找模式,一个没有模式的字符就是下一个字符。恕我直言,这个逻辑导致 nextChar 没有实现。
如果您需要按字符读取归档的字符,则可以使用更高效的类。
我想这与编码有关。Achar
是 16 个字节,一些编码会使用一个字节来表示一个字符,而另一种编码会使用两个甚至更多。最初设计 Java 时,他们假设任何 Unicode 字符都可以容纳 2 个字节,而现在一个 Unicode 字符最多需要 4 个字节(UTF-32)。无法Scanner
在单个char
.
您可以在构造实例时指定编码Scanner
,如果未提供,它将使用平台字符集。但这仍然不能处理 3 或 4 字节 Unicode 字符的问题,因为它们不能表示为单个char
基元(因为char
只有 16 个字节)。所以你最终会得到不一致的结果。