使用charset编码读取文件

时间:2017-07-26 21:16:27

标签: java encoding utf-8

我试图通过java中的缓冲输出流在Windows Notepad中编写阿拉伯语单词,并且在写入记事本的字符集编码后变为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编码,在阅读时使用其他编码吗?

1 个答案:

答案 0 :(得分:1)

问题不在于它不能用UTF-8阅读,而是你在阅读操作中诋毁编码。 FileInputStream.read()非常清楚地说明一次读取一个字节。如果文件中有多字节序列,则转换为字符的字节不会起作用(几乎可以肯定,因为它是阿拉伯语)。

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

  

InputStreamReader是从字节流到字符流的桥接:它使用指定的字符集读取字节并将其解码为字符。它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。

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

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