Java bug?无法直接使用Scanner读取GB2312文件

时间:2012-01-05 13:06:23

标签: java java.util.scanner readfile gb2312

我有一个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

1 个答案:

答案 0 :(得分:1)

我现在无法测试我的答案,但JDK 6文档根据您使用的API建议了不同的规范名称:io或nio

JDK 6 Supportted Encondings

也许,您应该使用“EUC_CN”而不是使用“GB2312”,它是Java I / O的建议规范名称。