先说结论
java.io中有四个最基础的抽象类,所有的字节流和字符流都是继承于下面四个中其中一个。
字节流: java.io.InputStream 、java.io.OutputStream
字符流:java.io.Reader、 java.io.Writer
字节流按字节读取,如果是读取图片,视频,ppt,word等建议使用字节流。
字符流按字符读取。不能读取图片和视频等,但可以读取文本文件。
引用一篇博客的说法:每次读取字符流都会对照码表翻译,当码表不存在该字符的翻译,会显示错误从而导致数据错误或丢失。参考用记事本打开图片,看到的都是乱码哦呵呵。
所以:
FileInputStream继承于InputStream,是字节流,可读取任意编码格式文件。
FileReader继承于Reader,是字符流。可读取文本类型文件。以项目默认编码读取文件,当被读取文件的编码不是项目默认编码,建议使用InputStreamReader字节流字符流转换桥梁。想知道为啥是默认编码的可以参考源码分析
下面两张图读者可以忽略(仅供自己mark)
Charset.defaultCharset中读取的是默认的字符
项目下.idea 的encodings.xml
例子
test.java
import java.io.*;
import java.nio.charset.Charset;
public class test {
public static void main(String[] args) {
//1 FileInputStream
try {
File