I/O:BIO(阻塞式IO,基于抽象类)
I/O部分的学习,我主要围绕字节输入流InputStream、字节输出流OutputStream、字符输入流Reader、字符输出流Writer的常用方法以及整体结构来展开。
下图为整理总结的结构图:
一、File文件操作类:
File类既可以描述文件,也可以描述文件夹。
1.File的使用:
(1)产生File对象:
- File(String pathname):根据文件的绝对路径来产生file对象
- File(String parent,String child):设置父路径和子路径
- File(URI uri):根据网络产生file对象
(2)常用的操作方法:
- boolean exists():判断文件是否存在
- boolean delete():删除文件
- File.separator:文件分隔符
linux下文件名区分大小写,使用’/’
windows下不区分大小写,使用’’ - String getParent():取得父路径的目录
- File getParentFile():取得父路径的File对象
- boolean mkdirs():创建当前目录,如果当前目录的父目录不存在,一并创建
- boolean mkdir():创建当前目录,如果当前目录的父目录不存在,创建失败
- boolean createNewFile():创建一个新文件
- boolean isFile():判断是否是文件
- boolean isDirectory():判断是否是目录
- long length():取得文件大小,以字节为单位
- long lastModified():取得最后修改时间
二、字节流与字符流:
1.字节操作流:原生操作,无需转换,可以处理文本文件、图像、音乐、视频等资源
(1)InputStream字节输入流
(2)OutputStream字节输出流:只接受字节数组
-
void close():关闭流
-
void flush():字符流若未关闭,数据在缓冲区中存放,不会输出到目标终端,要想将数据输出,要么将输出流关闭;yaom使用flush()强制刷新缓冲区。
-
FileOutputStream的构造方法:
a. new FileOutputStream(file):若输出数据时,file文件不存在,则会自动创建文件(不包含创建目录),此时父目录必须存在
b. new FileOutputStream(file,true):需要文件内容追加
AutoCloseable接口:进行自动关闭处理
必须使用try…catch代码块,try(定义要关闭的流对象)
2.字符操作流:经过处理后的操作,只用于处理中文文本
(1)Reader字符输入流:只能接受字符数组
(2)Writer字符输出流
3.流媒体文件:视频和音频
4.流模型的基本操作流程: -
取得终端对象
-
根据终端对象取得输入输出流
-
根据输入输出流进行数据的读取与写入
-
关闭流:IO操作属于资源处理,所有的资源处理(IO操作,数据库操作,网络操作)在使用后一定要关闭。
三、转换流:
1.InputStreamReader:字节输入流–>字符输入流
new InputStreamReader(InputStream in)
2.OutputStreamWriter:字节输出流–>字符输出流
new OutputStreamReader(OutputStreamReader out)
四、内存操作流:
1.内存流:以内存为终端的输入输出流
2.字节内存流:
(1)ByteArrayInputStream(byte[] data):字节内存输入流
(2)ByteArrayOutputStream:字节内存输出流
3.字符内存流:
(1)CharArrayReader:字符内存输入流
(2)CharArrayWriter:字符内存输出流
五、打印流:针对输出流的强化版本
1.装饰设计模式:在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能
2.装饰设计模式基于抽象类,核心依然是某个类的功能,为了得到更好的效果,让其支持的功能更多。
优点:很容易更换装饰类来达到不同的操作效果
缺点:造成类结构复杂
3.打印流的设计属于装饰设计模式,例如:核心是OutputStream抽象类实现的writer()功能,但是为了强化其功能,使用装饰类PrintStream
4.PrintWriter可以接受OutputStrem和Writer的对象
PrintStream只能接受OutputStream的对象
六、两种输入流:
1.BufferReader类:缓冲输入流(字符流) -
BufferReader(Reader in)
-
String readLine():读取一行数据,默认以回车作为分隔符
2.java.util.Scanner类:与IO有关却不在io包下的唯一类 -
定义分隔符:useDelimiter(Pattern pattern)
-
可以接收所有类型(File、Path、String、InputStream),支持正则表达式
七、序列化:
Java中要对一个对象进行序列化,该对象的类必须实现Serializable接口(标识性接口),才具备序列化的功能
1.序列化:内存里的类的实例化对象转成二进制数据流
2.反序列化:二进制数据流转成类的实例化对象
3.具体实现序列化和反序列化需要使用io包中提供的两个处理类:
(1)ObjectOutputStream:序列化 -
ObjectOutputStream(OutputStream out):选择目标终端
-
void writeObject(Object obj):将obj变为二进制流输出到目标终端
(2)ObjectInputStream:反序列化 -
ObjectInputStream(InputStream in):选择目标终端
-
Object readObject():将二进制流反序列化为Object对象
4.transient关键字:
若希望类中的若干属性不被序列化,可以在属性前添加transient关键字。