加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:30:28 所属栏目:Java 来源:网络整理
导读:我有一个GB3212编码的文件(中文).文件从这里下载 http://lingua.mtsu.edu/chinese-computing/statistics/char/list.php?Which=MO,与Windows下的wget一样,并存储到ModernChineseCharacterFrequencyList.html文件名中. 下面的代码演示了Java如何以一种方式读取
我有一个GB3212编码的文件(中文).文件从这里下载 http://lingua.mtsu.edu/chinese-computing/statistics/char/list.php?Which=MO,与Windows下的wget一样,并存储到ModernChineseCharacterFrequencyList.html文件名中.

下面的代码演示了Java如何以一种方式读取它并且能够与另一种方式结束.

即,如果使用scanner =新扫描程序(src,“GB2312”)创建扫描程序,则代码不起作用.如果Scanner是使用scanner = new Scanner(新的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);
    }

}

这是一个小故障还是设计行为?

UPDATE

当代码运行时,它只读取所有令牌.如果它不起作用,它会取消大约在中间读取,没有异常或错误消息.

在休息处找不到奇点.也没有像2 ^ 32这样的“神奇”数字出现.

更新2

最初的行为是在Windows上使用Sun的JavaSE 1.6发现的

现在在Ubuntu上也发现了与OpenJDK 1.6.0_23相同的行为

解决方法

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

JDK 6 Supportted Encondings

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读