我有一个 GB3212 编码(中文)的文件。文件从这里下载http://lingua.mtsu.edu/chinese-computing/statistics/char/list.php?Which=MO与 Windows 下的 wget 一样,并存储到 ModernChineseCharacterFrequencyList.html 文件名中。
下面的代码演示了 Java 如何无法以一种方式读取它并以另一种方式结束。
即,如果Scanner
用scanner = new Scanner(src, "GB2312")
代码创建是行不通的。如果Scanner
是用scanner = new Scanner(new FileInputStream(src), "GB2312")
then 创建的,它就可以工作。
分隔符模式线仅显示故障仍然存在的另一个选项。
public static void main(String[] args) throws FileNotFoundException {
File src = new File("ModernChineseCharacterFrequencyList.html");
//Pattern frequencyDelimitingPattern = Pattern.compile("<br>|<pre>|</pre>");
Scanner scanner;
String line;
//scanner = new Scanner(src, "GB2312"); // does NOT work
scanner = new Scanner(new FileInputStream(src), "GB2312"); // does work
//scanner.useDelimiter(frequencyDelimitingPattern);
while(scanner.hasNext()) {
line = scanner.next();
System.out.println(line);
}
}
这是故障还是设计行为?
更新
当代码正常工作时,它只会读取所有令牌直到结束。当它不起作用时,它会取消大约在中间的读取,没有异常或错误消息。
没有发现断裂处的奇点。也没有像 2^32 这样的“神奇”数字出现。
更新 2
最初该行为是在带有 Sun 的 JavaSE 1.6 的 Windows 上发现的
现在,在带有 OpenJDK 1.6.0_23 的 Ubuntu 上也发现了相同的行为