文章目录
总结 JAVA IO必会概念(思维导图)
- java io可以让我们用标准的读写操作来完成对不同设备的读写数据工作.
- java将IO按照方向划分为输入与输出,参照点是我们写的程序.
- 输入:用来读取数据的,是从外界到程序的方向,用于获取数据.
- 输出:用来写出数据的,是从程序到外界的方向,用于发送数据.
java将IO比喻为"流",即:stream. 就像生活中的"电流",“水流"一样,它是以同一个方向顺序移动的过程.只不过这里流动的是字节(2进制数据).所以在IO中有输入流和输出流之分,我们理解他们是连接程序与另一端的"管道”,用于获取或发送数据到另一端.
因此流的读写是顺序读写的,只能顺序向后写或向后读,不能回退。
字节流 OS和 IS
java将流按照读写单位划分为字节与字符流。字节流以字节为单位读写,字符流以字符为单位读写。
Java定义了两个超类(抽象类): java.io.InputStream和java.io.OutputStream
-
java.io.InputStream:所有字节输入流的超类,其中定义了读取数据的方法.因此将来不管读取的是什么设备(连接该设备的流)都有这些读取的方法,因此我们可以用相同的方法读取不同设备中的数据
-
常用方法:
-
int read():读取一个字节,返回的int值低8位为读取的数据。如果返回值为整数-1则表示读取到了流的末尾
-
int read(byte[] data):块读取,最多读取data数组总长度的数据并从数组第一个位置开始存入到数组中,返回值表示实际读取到的字节量,如果返回值为-1表示本次没有读取到任何数据,是流的末尾。
-
-
-
java.io.OutputStream:所有字节输出流的超类,其中定义了写出数据的方法.
-
常用方法:
-
void write(int d):写出一个字节,写出的是给定的int值对应2进制的低八位。
-
void write(byte[] data):块写,将给定字节数组中所有字节一次性写出。
-
void write(byte[]data,int off,int len):块写,将给定字节数组从下标off处开始的连续len个字节一次性写出。
-
-
java将流分为两类:节点流与处理流:
-
节点流:也称为低级流.
节点流的另一端是明确的,是实际读写数据的流,读写一定是建立在节点流基础上进行的.
-
处理流:也称为高级流.
处理流不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对数据进行加工处理来简化我们对数据的该操作.
实际应用中,我们可以通过串联一组高级流到某个低级流上以流水线式的加工处理对某设备的数据进行读写,这个过程也成为流的连接,这也是IO的精髓所在.
1. 文件流(低级流)–读写文件
1.1 FOS文件输出流
java.io.FileOutputStream继承自java.io.OutputStream
(1) 常用构造器: 覆盖模式(2个)和追加模式(3个)
覆盖模式对应的构造器:
覆盖模式是指若指定的文件存在,文件流在创建时会先将该文件原内容清除。
-
FileOutputStream(String pathname):创建文件输出流用于向指定路径表示的文件做写操作
-
FileOutputStream(File file):创建文件输出流用于向File表示的文件做写操作。
注:如果写出的文件不存在文件流自动创建这个文件,但是如果该文件所在的目录不存在会抛出异常:java.io.FileNotFoundException
追加写模式对应的构造器
追加模式是指若指定的文件存在,文件流会将写出的数据陆续追加到文件中。
- FileOutputStream(String pathname,boolean append):如果第二个参数为true则为追加模式,false则为覆盖模式
- FileOutputStream(File file,boolean append):同上
(2) 常用方法:3个
void write(int d):向文件中写入一个字节,写入的是int值2进制的低八位。
void write(byte[] data):向文件中块写数据。将数组data中所有字节一次性写入文件。
void write(byte[] data,int off,int len):向文件中快写数据。将数组data中从下标off开始的连续len个字节一次性写入文件。
1.2 FIS文件输入流
java.io.FileInputStream继承自java.io.InputStream
(1) 常用构造器 2个
FileInputStream(String pathname) 创建读取指定路径下对应的文件的文件输入流,如果指定的文件不存在则会抛出异常java.io.FileNotFoundException
FileInputStream(File file) 创建读取File表示的文件的文件输入流,如果File表示的文件不存在则会抛出异常java.io.IOException。
(2) 常用方法: int read()/int read(byte[] data)
int read():从文件中读取一个字节,返回的int值低八位有效,如果返回的int值为整数-1则表示读取到了文件末尾。
int read(byte[] data):块读数据,从文件中一次性读取给定的data数组总长度的字节量并从数组第一个元素位置开始存入数组中。返回值为实际读取到的字节数。如果返回值为整数-1则表示读取到了文件末尾。
2 缓冲字节流(高级流)–加快读写效率
缓冲流是一对高级流,在流链接中链接它的目的是加快读写效率。缓冲流内部默认缓冲区为8kb,缓冲流总是块读写数据来提高读写效率。
2.1 BOS缓冲字节输出流,
BufferOutputStream继承自java.io.OutputStream
(1) 常用构造器:2个
- BufferedOutputStream(OutputStream out):创建一个默认8kb大小缓冲区的缓冲字节输出流,并连接到参数指定的字节输出流上。
- BufferedOutputStream(OutputStream out,int size):创建一个size指定大小(单位是字节)缓冲区的缓冲字节输出流,并连接到参数指定的字节输出流上。
(2) 常用方法:flush(),和3个写出
flush():强制将缓冲区中已经缓存的数据一次性写出
缓冲流的写出方法功能与OutputStream上一致,需要知道的时write方法调用后并非实际写出,而是先将数据存入缓冲区(内部的字节数组中),当缓冲区满了时会自动写出一次。
2.2 BIS缓冲字节输入流
BufferInputStream继承自java.io.InputStream
(1) 常用构造器:2个
- BufferedInputStream(InputStream in):创建一个默认8kb大小缓冲区的缓冲字节输入流,并连接到参数指定的字节输入流上。
- BufferedInputStream(InputStream in,int size):创建一个size指定大小(单位是字节)缓冲区的缓冲字节输入流,并连接到参数指定的字节输入流上。
(2) 常用方法: 2个读取
缓冲流的读取方法功能与InputStream上一致,需要知道的时read方法调用后缓冲流会一次性读取缓冲区大小的字节数据并存入缓冲区,然后再根据我们调用read方法读取的字节数进行返回,直到缓冲区所有数据都已经通过read方法返回后会再次读取一组数据进缓冲区。即:块读取操作
3 对象流(高级流)–对象系列化和反序列化
对象流是一对高级流,在流链接中的作用是完成对象的序列化与反序列化
序列化:是对象输出流的工作,将一个对象按照其结构转换为一组字节的过程。
反序列化:是对象输入流的工作,将一组字节还原为对象的过程。
3.1 OIS对象输入流
ObjectInputStream继承自java.io.InputStream
(1) 常用构造器 1个
ObjectInputStream(InputStream in):创建一个对象输入流并连接到参数in这个输入流上。
(2) 常用方法 1个向下造型
Object readObject():进行对象反序列化,将读取的字节转换为一个对象并以Object形式返回(多态)。
如果读取的字节表示的不是一个java对象会抛出异常:java.io.ClassNotFoundException
3.2 OOS对象输出流
java.io.ObjectOutputStream继承自java.io.OutputStream
(1) 常用构造器 1个
ObjectOutputStream(OutputStream out):创建一个对象输出流并连接到参数out这个输出流上
(2)常用方法 1个
void writeObject(Object obj):进行对象的序列化,将一个java对象序列化成一组字节后再通过连接的输出流将这组字节写出。
如果序列化的对象没有实现可序列化接口:java.io.Serializable就会抛出异常:java.io.NotSerializableException
3.3 序列化接口Serrializable
java.io.Serrializable该接口没有任何抽象方法,但是只有实现了该接口的类的实例才能进行序列化与反序列化。
实现了序列化接口的类建议显示的定义常量:static final long serialVersionUID = 1L;
transient 只修饰属性–忽略(瘦身)
可以为属性添加关键字transient,被该关键字修饰的属性在序列化是会被忽略,达到对象序列化瘦身的目的。
字符流 Reader和Writer
java将流按照读写单位划分为字节与字符流。字节流以字节为单位读写,字符流以字符为单位读写。
字符流是以"char"为单位读写数据的,因此字符流【仅适合读写文本数据】
1. 转换流 ISR和OSW
InputSteamReader和OutSteamWriter功能无需掌握,了解其核心意义:
1:衔接其它字节与字符流
2:将字符与字节进行转换
相当于是现实中的"转换器"
2. 缓冲字符输出流BW
缓冲字符输出流: java.io.BufferedWriter
- 其内部维护一个char数组,默认长度8192。缓冲字符流与缓冲字节流道理是一样的
- 都是将读写的数据最终转换为块读写进行保证读写效率。
- 块写文本数据加速
- 可以按行写字符串
3. BufferedReader按行读取
缓冲字符输入流:java.io.BufferedReader
- 内部维护一个默认8192长度的char数组,缓冲字符流与缓冲字节流道理是一样的
- 块读文本数据。
- 特点:可以按行读取字符串
3.1 String readLine()
返回一行字符串,返回的字符串中不含有本行末尾的换行符。
如果本行为空行(只有换行符)那么返回值为空字符串。
如果流读取到了末尾,则返回值为null。
4. PW缓冲字符输出流–自动行刷新
java.io.PrintWriter是具有自动行刷新功能的缓冲字符输出流,其内部总是连接 BufferedWriter。
如果实例化PW时第一个参数传入的是一个流,则此时可以再传入一个boolean型的参数,此值为true时就打开了自动行刷新功能。 即: 每当我们用PW的println方法写出一行字符串后会自动flush.
(1) 常用构造器 6个
PrintWriter(String filename) :可以直接对给定路径的文件进行写操作
PrintWriter(File file):可以直接对File表示的文件进行写操作
上述两种构造器内部会自动完成流连接操作。
PrintWriter(OutputStream out):将PW链接在给定的字节流上(构造方法内部会自行完成转换流等流连接)
PrintWriter(Writer writer):将PW链接在其它字符流上
PrintWriter(OutputStream out,boolean autoflush)
PrintWriter(Writer writer,boolean autoflush)
上述两个构造器可以在链接到流上的同时传入第二个参数,如果该值为true则开启了自动行刷新功能。
(2)常用方法
void println(String line):按行写出一行字符串
(3) 特点
1:可以按行写出字符串
2:可以自动行刷新