FileReader读取文件的过程中,FileReader继承了InputStreamReader,但并没有实现父类中带字符集参数的构造函数,并没有实现父类中带字符集参数的构造函数,所以FileReader只能按系统默认的字符集来解码,造成结果不能还原最初的字符。

解决方案:

用字节码解析文件:

  1. FileInputStream stream = new FileInputStream(targetFile);

    byte[] bytes = IOUtils.toByteArray(stream);

    String s = new String(bytes,"utf-8");

  2. InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\default.txt"), “utf-8”);

    InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集

    int in = 0;
    char[] chars = new char[1024];
    while ((in = isr.read(chars)) != -1) {

       System.out.prinltn(">>>"+String.valueOf(chars));    

   }