Java 为什么';Scanner类是否有nextChar方法?

Java 为什么';Scanner类是否有nextChar方法?,java,Java,这真的是一种好奇,而不是一个问题 为什么Scanner类没有nextChar()方法?当你考虑到它有“下< /COD>”、“代码> NEXTENT < /代码>、 NExtLe> < /Cuff>等方法时,它应该是这样的。 我意识到您可以简单地执行以下操作: userChar = in.next().charAt(0); System.out.println( userChar ); 但是为什么不使用nextChar()方法呢?根据扫描仪的说法似乎不适用于读取单个字符。将扫描仪连接到输入流(

这真的是一种好奇,而不是一个问题

为什么
Scanner
类没有
nextChar()
方法?当你考虑到它有“<代码>下< /COD>”、“代码> NEXTENT < /代码>、<代码> NExtLe> < /Cuff>等方法时,它应该是这样的。 我意识到您可以简单地执行以下操作:

userChar = in.next().charAt(0);
System.out.println( userChar  );
但是为什么不使用
nextChar()
方法呢?

根据
扫描仪的说法
似乎不适用于读取单个字符。将
扫描仪
连接到
输入流
(或其他内容),它会为您解析输入。它还可以去除不需要的字符。所以你可以很容易地阅读数字、线条等。当您只需要输入中的字符时,请使用例如

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


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

Scanner类基于在String
next(Pattern)
方法中实现的逻辑。附加的API方法,如
nextDouble()
nextFloat()
。提供里面的图案

然后上课:

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

扫描仪使用分隔符模式将其输入拆分为标记, 默认情况下与空白匹配。由此产生的代币可以是 使用不同的next转换为不同类型的值 方法

从描述中可以看出,有人已经忘记了char,因为它确实是一种原始类型

但是类的概念是寻找模式,一个没有模式的字符只是下一个字符。这一逻辑导致nextChar尚未实现


如果你需要一个字符一个字符地读取一个文件,你可以使用更高效的类。

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


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

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

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

  • 如果
    nextChar()
    to的行为类似于
    read()
    Reader
    上,并且只是从扫描仪返回下一个未使用的字符,则它的行为与其他
    next
    方法不一致。在尝试解析值之前,这些字符跳过分隔符字符

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

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

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

不管他们做出什么选择,有些人都不会高兴。我猜设计师们决定远离柏油坑



1-强烈支持原始角色方法。。。但问题是,还有一些替代方案需要分析,等等。

作为一种解决方法,您可以尝试
下一步(“.”
。查看源代码,似乎
下一步(“.”
将首先跳过分隔符(默认情况下为空白)。也许这就是我们想要的。如果没有,则需要使用
sc.delimiter()
保存当前的分隔符模式,使用
sc.usedimiter(??
将其设置为与任何内容都不匹配的内容(可能是一个空模式,但我没有测试它);然后
下一步(“.”
;然后
sc.useDelimiter
还原上一个分隔符。我不明白。如果
Scanner
无法检索字符,因为它无法识别编码,那么它如何实现任何扫描方法?毕竟,这些方法必须看字符,不是吗?你是说返回
String
的方法吗?问题是,如果您有一个4字节的unicode字符,您将如何将其表示为
字符
?如果它是一个
字符串
,那么它可以在内部表示为一个
char
数组,数组中有两个
char
s。但是,如果您处理的是3字节或4字节的unicode字符,则无法从
nextChar
获得有意义的响应。据我所知,
读取器负责处理编码。如果您使用
sc,请查看@VivinPaliath。下一步(“.”
,正如Joachim所建议的,如果有任何字符要返回,它将返回一个1字符的
字符串。如果由于编码问题,
Scanner
无法返回字符,它也将无法返回1个字符的字符串。@ajb 1个“字符”的字符串仍处于内部状态