Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以未知编码读取文本行_Java_Character Encoding_Decoding - Fatal编程技术网

Java 以未知编码读取文本行

Java 以未知编码读取文本行,java,character-encoding,decoding,Java,Character Encoding,Decoding,我需要逐行读取一个文本文件,然后依次向每个文件应用几个字符集解码器。实际上,我首先尝试将该行解码为UTF8编码的行,如果UTF8 CharsetDecoder引发格式错误的InputException,则返回到一字节字符集 但是,如果我将InputStreamReader与默认或指定的字符集一起使用,readLine函数会将其认为对指定的字符集无效的所有字节以“?”悄悄替换 最后,我编写了自己的函数来读取行,从一个字节一个字节地读取流,寻找行终止符并构造行。但这样看来,它的速度非常慢 有没有办法

我需要逐行读取一个文本文件,然后依次向每个文件应用几个字符集解码器。实际上,我首先尝试将该行解码为UTF8编码的行,如果UTF8 CharsetDecoder引发格式错误的InputException,则返回到一字节字符集

但是,如果我将InputStreamReader与默认或指定的字符集一起使用,readLine函数会将其认为对指定的字符集无效的所有字节以“?”悄悄替换

最后,我编写了自己的函数来读取行,从一个字节一个字节地读取流,寻找行终止符并构造行。但这样看来,它的速度非常慢

有没有办法让Java在不接触字节的情况下读取行

更新: 我发现有些字符集中所有256字节都是有效的,其中两个是行终止符。 因此,可以逐行读取原始字节流
。
此类字符集的示例如下:

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


问题现在已经解决。

您不能使用reader类而不希望它解码底层字节流。如果您有一个文件,其中每一行都用不同的字符集(?)编码,那么您最好设计一种检测底层字符编码的方法。也许您可以使用编码检测器,例如。

“看起来非常慢”-您的意思是“看起来会…”还是“我测量了它,它是…”?这个问题与这个问题是重复的:我认为可以公平地假设,逐字节读取流以确定编码比使用InputStreamReader读取流要慢得多。事实并非如此。我不会问如何确定字符集编码,因为我有办法做到这一点。我需要一种在不弄乱字节的情况下读取行的方法。@软件Monkey我运行readLine版本和逐字节运行,我感觉第二种速度明显较慢。如果存在一种单字节编码,InputStreamReader认为所有字节都是有效的,因此不会将其替换为“?”,我可以将它用于我的目的。我不能使用外部库,只能使用核心java.*类。幸运的是,这样的字符集是存在的!我会更新这个问题。这里是否可以将问题标记为已结束?