IO流
一、File类
java.io.File
类是文件和文件目录的抽象表示,与平台无关,与文件或目录是否存在无关File
能新建、删除、重命名文件和目录,但File
不能访问文件内容本身,如果要访问需要使用IO流
二、IO流
1.流的分类
- 输入流和输出流
- 输入流基类:
InputStream
、Reader
- 输出流基类:
OutputSteam
、Writer
- 字节流和字符流
- 字节流操作的数据单元是8位的字节,字符流操作的数据单元是16位的字符
- 字节流基类:
InputSteam
、OutputStream
- 字符流基类:
Reader
、Writer
- 节点流和处理流
- 节点流直接从源或目的地读写数据,处理流包装节点流
2.IO流体系
- IO流体系
- 在使用处理流包装了底层节点流值后,关闭输入/输出流资源时,只要关闭最上层的处理流即可。关闭最上层处理流时,系统会自动关闭该处理流包装的节点流,关闭流的顺序与打开流的顺序相反
- 如果进行输入/输出的内容是文本内容,则考虑使用字符流;如果进行输入/输出的内容是二进制内容,则考虑使用字节流
- 缓冲流可以提高输入、输出的效率,增加缓冲流后,数据会先写到缓冲区中,缓冲区写满后才会一次性写到文件中,需要使用
flush()
方法才可以将缓冲区的内容写入实际的物理节点,直接使用close()
方法会先刷新缓冲区,再关闭流 - 转换流用于将字节流转换成字符流
- 打印流用于将基本数据类型的数据格式化为字符串输出
- 随机存取文件流:
RandomAccessFile
类支持随机访问的方式,可以直接跳到文件的任意位置来读写文件 - 对象流用于存储和读取基本类型数据或对象,只有实现了
Serializable
或Externalizable
接口的对象才能被序列化- 序列化:用
ObjectOutputStream
保存基本类型数据或对象 - 反序列化:用
ObjectInputStream
读取基本类型数据或对象 ObjectOutputStream
和ObjectInputStream
不能序列化static
和transient
修饰的成员变量
- 序列化:用
三、编码与解码
1.字符编码
Unicode
只是定义了一个庞大的、全球通用的字符集,并未每个字符规定了唯一确定的编号,具体存储成什么样的字节流,取决于字符编码方案UTF-8
就是每次传输8位数据,UTF-16
就是每次传输16位数据,ANSI
就是平台默认编码- 编码:字符编码为字节码
public byte[] getBytes(Charset charset)
- 解码:字节码解码为字符
public String(byte bytes[], int offset, int length, String charsetName)
- 乱码的原因:字节码不够编码为一个字符、字符集不统一