我有一个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")
,那么它就可以正常工作。
分隔符图案线只显示毛刺剩余的另一个选项。
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
最初在Windows上使用Sun的JavaSE 1.6
发现了这种行为现在Ubuntu上也发现了同样的行为,OpenJDK 1.6.0_23
答案 0 :(得分:1)
我现在无法测试我的答案,但JDK 6文档根据您使用的API建议了不同的规范名称:io或nio
也许,您应该使用“EUC_CN”而不是使用“GB2312”,它是Java I / O的建议规范名称。