I/O流:
流是对各类信息的抽象,可以看做是连接JAVA程序和外界的输入输出管道(以java为第一视角)
输入流:读数据。输出流:写数据。

字节流:字节/二进制。用于图像、声音文件。用InputStream、OutputStream(两个祖先类)。
FileInputStream 读取字节型文件,无法直接读取中文。
.mkdins 创建文件夹
.creatNewFile 创建文件
rest:重置,若有mark位,重置到mark位,若无直接重置到首位(仅字节流,字符流中需手动mark)。
FileOutputStream和TybeArrayOutputStream中File、TybeArray直接写入目的地。
BufferInputStream/BufferOutputStream缓冲流:缓冲流不会直接写入文本当中,需要写入时用.flush刷新。其中Buffer是内置字节数组,是提高工作效率的关键所在,默认为8192(8k)个字节。如果不用Buffer,只用File read/write,每一个字节都需要与文件进行交互,占用资源降低效率。每次使用完毕都需要用.close对流进行关闭。关闭的顺序是由内向外。(fis>fos>bis>bos)

字符流:字符/文本。用于处理文本读取、存储,以及网络的信息交互。用Reader、Writer。能传输中文,不同编码方式中,每个中文所占字节数不同。GBK中每个中文占两字节,VTF-8占3个(核心:是编码集决定具体如何处理)。当出现乱码时很有可能时选错编码方式。
编码方式查询:System.getProperty("file.encoding");
字符长度查找:"字符".getBytes().length;

文件管理:读写文件。
通过操作流来进行对文件的操作。

InputStreamReader:字节流到字符流之间的桥梁。 应用时需指定编码集。
OutputStreamWriter:字符流到字节流之间的桥梁。写入:osw.write(str.charAt(i));

FileReader:读文件类,相比于InputStreamReader更方便。
FileWriter:写文件类,直接父类是OutputStreamWriter。支持中文。但在开始声明时一定要先声明为空,这是为了后续能对流进行关闭。因为在try中声明时,是局部变量,在finally中访问不到,所以不能对其进行关闭。

在编写代码之前,要先确认所写入的文件与编译器是否使用同一个编码集,如果不先确认,在后续修改中会产生乱码。

BufferedReader/Writer:读取/写入缓冲类。直接父类是Reader/Writer。