流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作
IO流的分类:
操作文件的内容,对文件内容的读写
1.根据数据流向不同分为:(方向,相对内存来讲)
(1)输入流(读取):InputStream及其子类、Reader及其子类
(2)输出流(写入):OutputStream及其子类、Writer及其子类
2.根据处理数据类型的不同分为:(单位)
(1)字节流:InputStream及其子类、OutputSteam及其子类
常用来读写:音频、视频、图片等文件
①输入字节流InputStream:
1) InputStream是所有的输入字节流的父类,它是一个抽象类
2) ByteArrayInputStream、StringBufferInputStream、FileInputStream是三种基本的介质流,它们分别从Byte数组、StringBuffer、和本地文件中读取数据。PipedInputStream是从与其他线程共用的管道中读取数据
3) ObjectInputStream和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)
②输出字节流OutputStream:
1) OutputStream是所有的输出字节流的父类,它是一个抽象类
2) ByteArrayOutputStream、FileOutputStream是两种基本的介质流,它们分别向Byte数组、和本地文件中写入数据。PipedOutputStream是向与其它线程共用的管道中写入数据
3) ObjectOutputStream和所有FilterOutputStream的子类都是装饰流
(2)字符流:Reader及其子类、Writer及其子类
常用来读写:文本、文字性质的文件
①字符输入流Reader:
1) Reader是所有的输入字符流的父类,它是一个抽象类
2) CharReader、StringReader是两种基本的介质流,它们分别将Char数组、String中读取数据。PipedReader是从与其他线程共同的管道中读取数据
3) BufferedReader很明显就是一个装饰器,它和其子类负责装饰其他Reader对象
4) FilterReader是所有自定义具体装饰流的父类,其子类PushbackReader对Reader对象进行装饰,会增加一个行号
5) InputStreamReader是一个连接字节流和字符流的桥梁,将字节流转字符流
②字符输出流Writer:
1) Writer是所有的输出字符流的父类,它是一个抽象类
2) CharArrayWriter、StringWriter是两种基本的介质流,它们分别向Char数组、String中写入数据。PipedWriter是向与其他线程共用的管道中写入数据
3) BufferedWriter是一个装饰器为Writer提供缓冲功能
字节流与字符流的区别:
1)读写单位不同:字节流是以字节(8bit)为单位,字符流是以字符为单位,一次可能读多个字节
2)处理对象不同:字节流是能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据
3.对象流:ObjectInputStream、ObjectOutputStream
1) ObjectInputStream:
readObject()
2) ObjectOutputStream
writeObject()
当要做对象流的读写操作时,要保证读写的对象被序列化,即实现java.io.Serializable接口即可,否则会抛出java.io.NotSeriazableException
①序列化:指的是把堆内存中的java对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点,这个过程就是序列化。即将数据结构或对象转换成二进制串的过程
②反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成java对象模型的过程。即将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
③ 读写的对象序列化:
1)在分布式系统中,此时需要把对象数据转换成为二进制,只要是要共享的数据的JavaBean对象,都得做序列化操作
2)服务器钝化:如果服务器发现某些对象好久没活动了,那么服务器就会把这些内存中的对象持久化在本地磁盘文件中(java对象转换为二进制文件)如果服务器发现某些对象需要活动时,先去内存中寻找,找不到再去磁盘文件中反序列化我们的对象数据,恢复成 Java 对象。这样能节省服务器内存。
4. 字节字符转换流:
1) InputStreamReader
InputStreamReader(InputStream)
2) OutputStreamWriter
OutputStreamWriter(OutputStream)
特点:
1) 字符流和字节流之间的桥梁
2) 可对读取到的字节数据经过指定编码转换成字符
3) 可对读取到的字符数据经过指定编码转换成字节
5. 缓冲流:
BufferedInputStream
BufferedInputStream(InputStream in)
BufferedOutputStream
BufferedOutputStream(OutputStream out)
BufferedReader
BufferedReader(Reader in)
BufferedReader(InputStreamReader(InputStream in))
BufferedWriter
BufferedWriter(Writer out)
BufferedWriter(OutputStreamWriter(OutputStream out))
6.用来读写特定类型(int等8个基本数据类型/String...)的IO流
① DataOutputStream
writeXxx()
② DataInputStream
readXxx()
注:读、写的顺序与类型,要保持一致。
7. NIO 非阻塞IO:
① 同时拥有阻塞模式和非阻塞模式
② NIO 是一种同步非阻塞的 IO 模型。同步是指线程不断轮询 IO 事件是否就绪,非阻塞是指线程在等待 IO 的时候,可以同时做其他任务。同步的核心就是 Selector,Selector 代替了线程本身轮询 IO 事件,避免了阻塞同时减少了不必要的线程消耗;非阻塞的核心就是通道和缓冲区,当 IO 事件就绪时,可以通过写道缓冲区,保证 IO 的成功,而无需线程阻塞式地等待。
8. File类:
File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想 来操作文件和文件夹。表示目录(文件夹)或文件
操作文件或目录的属性,不能操作文件的内容。
File(String pathname)
相对路径:相对于当前项目路径。
绝对路径:相对于磁盘路径。
获取目录中的子目录和文件
String[] list()
String[] list(FilenameFilter filter) 文件名过滤器
File[] listFiles()
File[] listFiles(FileFilter filter) 文件过滤器
File[] listFiles(FilenameFilter filter)
File类保存文件或目录的各种元数据信息,包括文件 名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定 文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
9. RandomAccessFile类:
该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区,通过内部的指针来操作字符数组中的数据
特点:
1) 该对象只能操作文件,构造函数接收两种类型的参数
a. 字符串文件路径
b. File对象
2) 该对象既可以对文件进行读操作,也能进行写操作,在进行对象实例化时,可指定操作模式
10. IO操作的步骤
1. 确定要操作的文件 File(路径)
2. 确定流的类型(读/写、字节/字符/对象...)
3. 实例化流对象
4. 执行读写(IO)操作
5. 关闭
网友评论