1. IO概述
Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
1.1 IO的分类
根据数据的流向分为:输入流和输出流。
-  
输入流 :把数据从
其他设备上读取到内存中的流。 -  
输出流 :把数据从
内存中写出到其他设备上的流。 
格局数据的类型分为:字节流和字符流。
-  
字节流 :以字节为单位,读写数据的流。
 -  
字符流 :以字符为单位,读写数据的流。
 -  

 
windows自带的记事本能打开的就是纯文本文件
1.2 IO的流向说明图解

1.3 顶级父类们
| 输入流 | 输出流 | |
|---|---|---|
| 字节流 | 字节输入流 InputStream | 字节输出流 OutputStream | 
| 字符流 | 字符输入流 Reader | 字符输出流 Writer | 

这四个类都是抽象类
字节流:

FileOutputStream:


字节流输出细节:
FileOutputStream写数据的3种方式:

法1:

法2:

法3:法三中三个参数的意思分别是:数组、起始索引、个数(从数组a中的i索引开始写,写len个长度)

写数据的细节:
1、换行写出:\r\n


2、续写:同一文件的续写就是在FileOutputStream的构造时,第二个参数写true


FileInputStream:
read():每次读取一个字节的数据并移动一个指针,读取不到返回-1

FileInputStream书写细节:

FileInputStream循环读取:

FileInputStream读取数据的2种方法:read空参和实参

空参返回数据,实参返回读了多少个数据
法2中:

比如字节数组长度是几就一次性读几位,但一般选取1024 的整数倍
具体详解:读取过程中,会尽可能将数组读满,并填补在数组中

每次读2个,读取最后一次时,只剩下一位可读,原来数组只有第一位被替换,索引第二位d始终保持不变
如何改造?

文件拷贝实例:
法一:速度很慢的写法(read())

法二:速度很快的写法(read(byte[ ]))

try catch异常处理:添加Finally


以JDK9以后举例:

关于汉字存储:


UTF-8编码:


为什么出现乱码?



为什么拷贝中文不会乱码?
读取拷贝数据时,用的数据集和编码格式与数据源保持一致,所以不会乱码
编码与解码的实现:


字符流:遇到中文自动读多个字节


FileReader:

与字节流不同,这里的read空参会根据中英文不同,自动转换读取的字节数


空参和有参的细节区别:
空参时,返回的是解码返回的10进制的整数
有参时,返回的相当于:空参+强转char类型,将强转后的数据放到了数组中

FileWriter:
 

FileWriter书写细节:


字符输入流原理解析:存在缓冲区(字节流没有)
简单来说,在数据源和内存间传送数据时,内存区中存在缓冲区,这个缓冲区中存在一个8192的字节数组,他会在传输时将文件中的数据读取进来使得尽可能充满缓冲区,存在缓冲区中,如果缓冲区中没有数据了,就会继续去文件中读取,如果文中没有了就会返回-1


字符输出流原理解析:存在缓冲区,数据先存在缓冲区
两种方法将数据送往目的地:
1、缓冲区满了自动送往
2、使用flush刷新
3、close


字符流与字节流的使用场景





















