JAVASE(十六) IO流 :File类、节点流、缓冲流、转换流、编码集、对象流
个人博客网:https://wushaopei.github.io/ (你想要这里多有)
1、File类型
1.1.File类的理解
- File类是在java.io包下
- File可以理解成一个文件(.mp3 .mp4 .txt)或者一个目录
- File没向文件写入数据的功能。只创建,删除,文件大小等方法。
- File可以理解成流的终端。
- 我们经常将File的对象作为实参传入到流的构造器中
- File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
1.2. 如何实例化
绝对路径:包含盘符在内的完整路径
相对路径:相对于当前的项目的路径。
1.3 File 类的常见构造器:
注意:File的静态属性String separator存储了当前系统的路径分隔符。
在UNIX中,此字段为‘/’,在Windows中,为‘\\’
1.4.常用方法
1.5 案例
2、IO流概述
2.1概念:
- I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
- Java程序中,对于数据的输入/输出操作以”流(stream)” 的方式进行。
- java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
2.2 Java IO原理
2.3.流的分类
- 按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
- 按数据流的流向不同分为:输入流,输出流
- 按流的角色的不同分为:节点流,处理流
- Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。
- 由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
图示:
2.4.流的体系结构(蓝色的部分是重点
2.5 输入流、输出流
- 节点流可以从一个特定的数据源读写数据
- 处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
(1)InputStream & Reader
(2)OutputStream & Writer
3、节点流(文件流)
文件流(1)
文件流 (2)
注意:
- 定义文件路径时,注意:可以用“/”或者“\\”。
- 在写入一个文件时,如果目录下有同名文件将被覆盖。
- 在读取文件时,必须保证该文件已存在,否则出异常。
字节流:
字符流:
4、缓冲流的使用
为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组
根据数据操作单位可以把缓冲流分为:
- BufferedInputStream 和 BufferedOutputStream
- BufferedReader 和 BufferedWriter
缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法
对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()将会使内存中的数据立刻写出
4.1 处理流之一:缓冲流
5、转换流的使用
作用:
- 将读取文件的字节流转换成字符流,将写入文件内容的字符流转成字节流
- 转换编码集 (读入的文件比如是UTF-8,写入的文件的可以变成GBK
- 注意:InputStreamReader设置的编码集必须和读取文件的编码集是一致的。
代码:
图示:
6、字符编码集
7、其他流的使用:标准输入输出流、打印流
7.1 标准输入输出流
- System.in和System.out分别代表了系统标准的输入和输出设备
- 默认输入设备是键盘,输出设备是显示器
- System.in的类型是InputStream
- System.out的类型是PrintStream,其是OutputStream的子类FilterOutputStream 的子类
- 通过System类的setIn,setOut方法对默认设备进行改变。
代码示例:
7.2 打印流
代码:
7.3 数据流
代码:
7.4 对象流的使用
序列化 :用ObjectOutputStream类保存基本类型数据或对象的机制 (保存对象,或者发送对象)
反序列化 :用ObjectInputStream类读取基本类型数据或对象的机制(读取对象,接收对象)
* 注意:
- 序列化对象的类必须实现Serializable接口
- 序列化对象的类的属性除基本类型外,也必须全部实现Serializable接口
- 需要声明一个 serialVersionUID (如果不显示声明系统会默认填加一个)
- 不能序列化static和transient修饰的成员变量
代码:
9、RandomAccessFile类的使用
需求:
文件中的内容 : abcdefg
需求: 在c的后面插入AAA
- 先将指针移动到c的后面
- 读取c后面的所数据并保存到一个临时变量中
- 指针回移,移动到c的后面
- 写入需要插入的数据
- 写入临时变量中的数据
代码: