【发布时间】:2011-09-29 07:20:03
【问题描述】:
我需要逐行读取一个文本文件,并按顺序对每个文件应用几个 CharsetDecoder。实际上,我首先尝试将行解码为 UTF8 编码的行,如果 UTF8 CharsetDecoder 引发 MalformedInputException,则回退到单字节字符集。
但是,如果我使用带有默认或指定字符集的 InputStreamReader,readLine 函数会默默地替换为“?”它认为对指定字符集无效的所有字节。
我最终编写了自己的函数来读取行,它逐字节地从流中读取,寻找行终止符并构造行。但是这种方式看起来非常慢。
有没有什么方法可以让 Java 在不接触字节的情况下读取行?
更新:
我发现有所有 256 个字节都有效的字符集,其中两个是行终止符。
因此可以读取原始字节流line by line。
此类字符集的示例如下:
IBM00858 IBM437 IBM775 IBM850 IBM852 IBM855 IBM860 IBM861 IBM862 IBM863 IBM865 IBM866 ISO-8859-1 ISO-8859-13 ISO-8859-15 ISO-8859-2 ISO-8859-4 ISO-8859-5 ISO-8859-9 KOI8-R KOI8-U windows-1256
问题现已结束。
【问题讨论】:
-
“看起来很慢” - 你的意思是“看起来会是……”还是“我测量了它并且它是……”?
-
我认为可以公平地假设逐字节读取流以确定编码比使用 InputStreamReader 读取要慢得多。
-
确实不是。我不问如何确定字符集编码,因为我有办法做到这一点。我需要一种读取行而不弄乱字节的方法。
-
@Software Monkey 我运行 readLine 版本和逐字节版本,我感觉第二个版本明显慢。
标签: java character-encoding decoding