使用字符集编码读取文件



我正在尝试通过java中的缓冲输出流在Windows记事本中编写阿拉伯语单词,并且在编写记事本的字符集编码后变为UTF-8,因此很明显,在java中写入文件的默认字符集是UTF-8,但是当我通过缓冲输入流读取它时,它不是通过UTF-8编码读取的,因为在读取它时结果是奇怪的符号

enter code here
class writeFile extends BufferedOutputStream {
public writeFile(OutpuStream out){
super(out);
}
public static void main(String arg[])
{ writeFile out=new writeFile(new FileOutputStream(new  
File("path_String")));
out.write("مكتبة".getByte());
}}

可以按原样编写,但是当阅读时:

enter code here
class readFile extends BufferedInputStream {
public readFile(InputStream In){
super(In);
}
public static void main(String arg[])
{ readFile in=new readFile(new FileInputStream(new  
File("path_String")));
int c;
while((c=in.read()!=-1)
System.out.print((char)c);
}} 

结果与之前写的文件中不同:ÙÙØªØ ̈Ø©

那么这是否意味着在编写Java时使用UTF-8编码,而在阅读中使用另一种编码?

问题不在于它不使用 UTF-8 读取,而在于您在读取操作中破坏了编码。FileInputStream.read()非常明确地规定一次读取一个字节。如果您的文件中有多字节序列,则转换为字符的字节将不起作用(您几乎可以肯定这样做,因为它是阿拉伯语(。

正如您所发现的,最简单的解决方案是使用InputStreamReader,它从底层FileInputStream(或其他流(中读取字节,并正确解码字符序列。这里的默认编码当然与编写器相同:

InputStreamReader是从字节流到字符流的桥梁:它读取字节并使用指定的字符集将它们解码为字符。它使用的字符集可以按名称指定,也可以显式给出,或者可以接受平台的默认字符集。

您可以通过将整个文件读取到字节缓冲区中,然后使用类似String(byte[])的东西解码整个文件来做类似的事情。如果读取整个文件,结果应该是相同的,因为现在解码器将有足够的信息来正确解析所有多字节字符。

有一个关于编码和解码的参考,我发现它对理解这个主题非常有用:http://kunststube.net/encoding/

最新更新