一、基本概念
应用程序和设备(比如屏幕、键盘、硬盘、U盘、内存、文件等)间经常需要传输数据,内存是临时存储,数据一般储存在设备上,Java为了简化开发流程,将这种数据传输封装成流的概念,屏蔽硬件细节。
流有两种:字节流和字符流。
字节流:就是把传输的数据看成是没有特定含义的二进制数据。
字符流:把数据看成是字符(针对文本,会用到内存)。
二、IO流类图
三、字节流
字节流2个顶级父类InputStream、OutputStream,它们都是抽象类、
1、InputStream提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | read( ) | 读取一个字节 |
2 | read(byte[] b) | 读取多个字节至数组b中 |
3 | read(byte[] b, int off, int len) | 读取多个字节至数组从off开始的len个字节中 |
4 | skip(long n) | 跳过n个字节 |
5 | close | 关闭输入流 |
2、OutputStream提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | write(int n ) | 写入一个字节(注意只写入低8位) |
2 | write (byte[] b) | 写入数组b中的全部字节 |
3 | write (byte[] b, int off, int len) | 写入数组b中从off开始len个字节 |
4 | flush( ) | 刷新输出流,即强制输出(因有缓冲机制) |
5 | close | 关闭输入流 |
FileInputStream继承自InputStream,封装了对文件的读取操作,通过文件路径或者文件对象构造一个FileInputStream对象。
FileOutPutStream继承自OutputStream,封装了对文件的写入操作,通过文件路径或者文件对象构造一个FileInputStream对象。
ObjectInputStream和ObjectOutPutStream分别封装了其它类型数据的读、写操作,ObjectInputStream构造函数传递需要InputStream子类的对象,ObjectOutPutStream构造函数传递需要OutPutStrea子类的对象。
3、ObjectInputStream提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | readInt、readFloat、readLong… | 读取基本类型数据 |
2 | readObject | 读取引用类型数据(需反序列化) |
4、ObjectOutPutStream提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | writeInt、writeFloat、writeLong… | 写入基本类型数据 |
2 | writeObject | 写入引用类型数据(需序列化) |
ObjectOutPutStream向文件中输出123和“abc”,结果如下:
5、序列化:
(1)所谓序列化就是将内存中的对象存储到外存上去。反序列化则反之,即将外存中的数据读入到内存中的对象中。
(2)内存中的数据在关机后就不存在了,而外存的数据是可以永久保存的。比如游戏过程中的保存游戏,就是将某个时刻的游戏状态(比如生命值、金钱、等级等)数据保存到硬盘上;而读取游戏就是根据从文件中恢复游戏的状态。
(3)这些数据可能是一个对象,也可能是多个对象组成的复杂数据,如果逐个将原子数据写入到文件中去,不仅复杂,而且在写入和保存的步骤和数据应该严格一致,否则数据就会错位。
(4)序列化是将对象(不管多么复杂)整体写入文件中,将来也是整体读取,简化了读写操作。
6、字节流中FileInputStream输入流和FileOutputStream输出流
复制图片
复制文件夹
四、字符流
1、Reader提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | read( ) | 读取一个字符 |
2 | read(char []b) | 读取多个字节至数组b中 |
3 | read(char []b, int off, int len) | 读取多个字节至数组从off开始的len个字节中 |
4 | skip(long n) | 跳过n个字符 |
5 | close | 关闭输入流 |
2、Writer提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | write(int n ) | 写入一个字符(注意只写入低8位) |
2 | write (char []b) | 写入数组b中的全部字符 |
3 | write (char []b, int off, int len) | 写入数组b中从off开始len个字符 |
4 | write (String str) | 写入字符串中的全部字节 |
5 | write (String str, int off, int len) | 写入字符串中从off开始len个字符 |
6 | flush( ) | 刷新输出流,即强制输出(因有缓冲机制) |
7 | close | 关闭输入流 |
FileReader和FileWriter分别实现了Reader和Writer。
3、FileReader:读,输入流
4、FileWriter:写,输出流
5、BufferedReader:输入流缓存区
6、BufferedWriter:输出流缓存区
缓冲机制用于应用程序和物理数据时降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。比如快递寄送点,并不是每收一个寄件就发送出去,而是收集到一定数量或一定时间后再整体发送。
7、复制文件
五、 File类
File类封装了对文件和目录的属性操作。目录也可以理解为一种特殊文件,下文中都统一称之为文件。
序号 | 方法 | 功能说明 |
1 | File(String path) | 根据路径构造一个文件 |
2 | getName() | 获取文件名 |
3 | exists() | 判断文件是否存在 |
4 | isDirectory() | 判断是否为目录 |
5 | isFile() | 判断是否为文件 |
6 | length() | 获取文件的大小 |
7 | close | 关闭输入流 |
8 | delete() | 删除文件 |
9 | list() | 列举文件或目录 |
10 | listFiles() | 列举文件 |
11 | mkdir() | 创建目录 |
12 | renameTo | 重命名,实际上也可以实现移动 |
六、PrintWriter中write方法和print方法的区别?
其实真正的说来是没有什么区别的,来看看print方法是如何写的,抽出一个原代码方法来看看。
public void print(boolean b) {
write(b ? "true" : "false");
}
实际上调用了write方法。跟我们去直接调用是一样的,只不过print方法提供了多种数据类型,而write都通过转换,大多数变为字符串输出了。