Ошибка Java? Не могу прочитать файл GB2312 со сканера напрямую - PullRequest
4 голосов
/ 05 января 2012

У меня есть файл в кодировке GB3212 (китайский). Файл загружается отсюда http://lingua.mtsu.edu/chinese-computing/statistics/char/list.php?Which=MO как есть с wget в Windows и сохраняется в файле ModernChineseCharacterFrequencyList.html.

Приведенный ниже код демонстрирует, как Java не может прочитать его до конца одним способом, а может - другим.

А именно, если Scanner создается с scanner = new Scanner(src, "GB2312"), код не работает. И если Scanner создается с scanner = new Scanner(new FileInputStream(src), "GB2312"), то он работает.

Линии рисунка-разделителя просто показывают другой вариант, с которым сохраняется сбой.

<code>public static void main(String[] args) throws FileNotFoundException {

    File src = new File("ModernChineseCharacterFrequencyList.html");
    //Pattern frequencyDelimitingPattern = Pattern.compile("<br>|<pre>|
"); Сканер сканер; Струнная линия; // scanner = new Scanner (src, "GB2312"); // не работает scanner = новый сканер (новый FileInputStream (src), "GB2312"); // работает //scanner.useDelimiter(frequencyDelimitingPattern); while (scanner.hasNext ()) { line = scanner.next (); System.out.println (линия); } }

Это глюк или нестандартное поведение?

UPDATE

Когда код работает, он просто читает все токены до конца. Когда он НЕ работает, он отменяет чтение примерно посередине без каких-либо исключений или сообщений об ошибках.

Сингулярности на месте разрыва не обнаружено. Также не проявилось никаких «магических» чисел, таких как 2 ^ 32.

ОБНОВЛЕНИЕ 2

Первоначально такое поведение было обнаружено в Windows с SunSESE 1.6

.

И теперь такое же поведение также наблюдается в Ubuntu с OpenJDK 1.6.0_23

1 Ответ

1 голос
/ 05 января 2012

Я не могу проверить свой ответ прямо сейчас, но документация JDK 6 предлагает разные канонические имена для encons в зависимости от используемого вами API: io или nio

JDK 6 Поддерживаемые Encondings

Возможно, вместо использования "GB2312" вы должны использовать "EUC_CN", который является рекомендуемым каноническим именем для ввода / вывода Java.

...