这个问题纯粹是学术性的(我从C#背景进入Java)。
我想知道如何扩展java.util.Scanner
类以添加Scanner.nextChar()
方法。
(请注意,答案可能不是Scanner.nextChar()
特有的,而只是扩展本地课程的一般步骤。非常感谢。)
答案 0 :(得分:3)
Scanner
是final
类,您无法扩展它。如果它是非最终类,你可以扩展它。正如Dennis建议的那样,您可以使用BufferedReader#Read
方法读取单个字符。
可能会延伸Reader
并模拟BufferedReader
?
答案 1 :(得分:2)
由于Scanner
是final
,您无法声明它的子类。周期。
可以想象,您可以修改 Scanner
类以删除final
修饰符。但是,这是类的一个事实是在一个保留包中意味着您需要修改 Java安装才能实现这一点。 (你也可以通过修改bootclasspath来做到这一点......但这相当于同样的事情。)
但说实话,如果没有必要修改Scanner
。相反,您可以简单地复制Scanner
源代码(例如来自OpenJDK代码库)并使用它在应用程序的包空间中创建一个具有额外方法的“无关”类。它不会按类型与真正的Scanner
类相关,但这不太可能是一个问题。
记录:
此Q& A - https://stackoverflow.com/a/18746676/139985 - 提供了Scanner
不支持readChar
的一些可能原因。 (当然注意到它显然是“意见”。)
使Scanner
最终成功的最可能原因是安全性。 final
扫描程序类意味着Scanner
实例可以安全地从不受信任的代码传递到沙盒环境中的受信任代码。
答案 2 :(得分:1)
要模仿nextChar
,您可以尝试将next
与空分隔符一起使用。
Scanner s = new Scanner("a\nb\tcd\re");
Pattern original = s.delimiter();// in case you wnat to get back to
// default delimiter
s.useDelimiter("");
while (s.hasNext()) {
char c = s.next().charAt(0);
System.out.println("'" + c + "'");
}
结果
'a'
' (here is printed value of `\n`)
'
'b'
' ' (here is printed value of `\t`)
'c'
'd'
' (here is printed value of `\r`)
'
'e'