编码:字符(能看懂的)--字节(看不懂的)
解码:字节(看不懂的)-->字符(能看懂的)
Character Encoding : 就是一套自然语言的字符与二进制数之间的对应规则。字符集 Charset:也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。
计算机要准确的存储和识别各种字符集符号,需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有ASCII字符集、GBK字符集、Unicode字符集等。
当指定了编码,它所对应的字符集自然就指定了,所以编码才是我们最终要关心的

FileReader 读取项目中的文本文件。由于IDEA的设置,都是默认的UTF-8编码,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是GBK编码,就会出现乱码。void close() 关闭此流,但要先刷新它。abstract  void flush() 刷新该流的缓冲。void write(int c) :写入单个字符。abstract  void write(char[] cbuf, int off, int len)  写入字符数组的某一部分。void write(String str) 写入字符串。void write(String str, int off, int len) 写入字符串的某一部分。OutputStreamWriter(OutputStream in): 创建一个使用默认字符集的字符流。OutputStreamWriter(OutputStream in, String charsetName): 创建一个指定字符集的字符流。public class Demo {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("D:\\document\\code\\xuexi\\java\\aaa\\a.txt"),"utf-8");
        osw.write("你好abc");//9个字节
        osw.flush();
        osw.close();
    }
}
public class Demo02 {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("D:\\document\\code\\xuexi\\java\\aaa\\a.txt"),"gbk");
        osw.write("你好abc");//7个字节
        osw.flush();
        osw.close();
    }
}
int read()读取单个字符。int read(char[] cbuf) 将字符读入数组。void close()关闭该流并释放与之关联的所有资源。InputStreamReader(InputStream in): 创建一个使用默认字符集的字符流,默认utf-8。InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集的字符流。//a.txt文件编码为gbk
public class Demo {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr=new InputStreamReader(new FileInputStream("D:\\document\\code\\xuexi\\java\\aaa\\a.txt"),"gbk");
        int len=0;
        while ((len=isr.read())!=-1)
            System.out.print((char) len);//你好abc
        isr.close();
    }
}
public class Demo {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr=new InputStreamReader(new FileInputStream("D:\\document\\code\\xuexi\\java\\aaa\\a.txt"));//默认编码为utf-8
        int len=0;
        while ((len=isr.read())!=-1)
            System.out.print((char) len);//???abc
        isr.close();
    }
}
原文:https://www.cnblogs.com/wu-myblog/p/14249191.html