IO流:存取皆为文件;
字节流文件:字节 byte ,可以以字节为单位存取数据
字符流文件:在java中,字符使用是双字节的Unicode编码
对象流文件:在java中,还可以以对象为单位存取数据;
文件:File
父类异常:IOException
IO章节的设计是有缺陷的,因为它设计时是“面向抽象类”的!
学习集合时,使用接口的引用,来操纵其具体的实现类;
学习IO时,使用抽象类的引用,来操纵其具体的子类;
字节流的抽象父类:
输出:
java.io.OutputStream
|java.io.FileOutputStream
|File
输入:
java.io.InputStream
|java.io.FileInputStream
|File
当操纵字节流时,如何操作?
只需要将抽象父类中的方法搞明白,用父类引用调用即可。
对于具体的子类,只需要注意构造器构成。
父类方法,子类构造器!
接口方法,实现类构造!
字符流的抽象父类:
输出:
java.io.Writer
|java.io.FileWriter
|File
输入:
java.io.Reader
|java.io.FileReader
|File
对象流:类是类操作
输出:
java.io.ObjectOutputStream
|java.io.FileOutputStream
|File
输入:
javao.io.ObjectInputStream
|java.io.FileInputStream
|File
关于字符的存储问题:
在java中使用是双字节编码;
问题:一个英文字符在java中存储时,实际上需要多大的空间?以2字节吗?
在String类中提供了将字符串转换为字节数组的方法:
使用Io包中的类处理的通常不是“堆区”资源,而是“系统资源”。
要点在于系统资源不会被垃圾回收器自动回收,只能“手动释放”!
在java中实际上有三类资源:
1、 可以自动回收的“堆区”资源,使用垃圾回收器机制完成;
2、 自动回收的“栈区”资源,超过生命周期时由程序自动回收;
3、 由程序员手动释放的资源,属于系统资源
a) io包中类操纵的系统资源
b) sql包中类操纵的系统资源
c) 使用以上两个包中的接口或类时,通常会有检查异常要处理;
在7.0版本之前,以上两个包中类或接口操纵的系统资源,是分别释放的,没有统一的操作方式,在7.0包括以后,将两类资源的释放统一起来。
抽象类OutputStream中定义的方法:
向文件中写入单个字节:
注意:参数为整数类型,而非字节类型;为什么?
//public void write(byte b);
使用最多的向文件中写入字节的方法,以字节数组为单位;
读取字节流文件时:
获取单个字节的方法:
注意:返回的整数类型,而非字节类型。为什么?
使用较多的从字节流文件中读取字节,将字节存储到字节数组中:
字符流的写读操作:
写入单个字符的方法:
注意:参数为整数类型,而非字符类型。为什么?
常用的写方法:
常用的方法:
读取字符流文件:
读取单个字符:
注意:返回是整数类型,而非字符类型。为什么?
读取字符,存入到字符数组中。
为什么读写字节或字符,写入的或读取的都是整数类型?
为了程序的扩展(包括编码表的可能性扩展),以及版本的升级。
核心类File
封装:用File的引用来指向实际存在某个位置上的数据文件;
位置:绝对路径和相对路径
在java中,将文件和文件夹共同封装为File类型;
几个重要的需要掌握的方法:
判断文件是否存在?
获取文件的绝对路径:
判断是否文件或文件夹?
查询某个已经存在的目录下有哪些子目录和文件:
一个重要的根据过滤规则获取文件的方法:
java.io.AutoCloseable 7.0
|java.io.Closeable 5.0
在7.0版本中添加了一个父接口AutoCloseable,定义了一个close()方法,至此Java中系统资源(io和sql)的释放,就由这一个接口完成。
// try-with-resource
7.0版本中新增加的这个功能是在异常处理代码中,对系统资源进行释放。
用字节流读取一个文件,简单的;
从一个文件中读取数据,再写入到另一个文件中;
比如用字节流读文件A,用字符流写入文件B;
与对象流有关的类和接口:
输入:
ObjectInput 接口
|ObjectInputStream 类
|FileInputStream
|File
ObjectOutput
|ObjectOutputStream
|FileOutputStream
|File
如何理解序列化问题?反序列化?
冰箱的作用就是序列化。序列化功能尤其用在网络传输方面,以保证传送数据的安全性。
对数据进行序列化操作之后,相当于对数据增强了保护;
当数据传输到目的地后,再进行反序列化操作,相当于获得了保护后的数据;
这样通过传输前的序列化保护和传输到目的地后数据的安全获取,达到了数据保护的目的。
利用输出对象流引用向文件中写对象,属于“序列化”操作;
利用输入对象流引用从文件中读取对象,属于“反序列化”操作;
向文件中序列化对象时的字段数据保护问题;