Ошибка Java? Не могу прочитать файл GB2312 со сканера напрямую
У меня есть файл в кодировке 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")
тогда это работает.
Линии рисунка разделителя просто показывают другой вариант, с которым остается сбой.
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 с SunSE Java 1.6
И теперь то же самое поведение также обнаружено в Ubuntu с OpenJDK 1.6.0_23
1 ответ
Я не могу проверить свой ответ прямо сейчас, но документация JDK 6 предлагает различные канонические имена для encons в зависимости от используемого вами API: io или nio
JDK 6 Поддерживаемые Encondings
Возможно, вместо использования "GB2312" вы должны использовать "EUC_CN", который является рекомендуемым каноническим именем для ввода-вывода Java.