IO
java流使用了一种装饰器设计模式,它将 IO 流分成底层节点流和上层处理流,其中节点流用于和物理节点直接关联,程序可以把不同物理节点流包装成统一的处理流,从而允许程序使用统一的输入、输出代码来读取不同物理节点的资源。
为什么要使用IO流?
- 当我们的程序需要从硬盘,网络,或其他应用程序中读取数据时,数据的传输量可能很大,而我们的内存或带宽有限,无法一次性读取写入大量的数据。
- 而流stream实现了一点一点逐步的传输数据。
- 想像我们下载一个大文件,并不会占用你很大的内存空间,而是将内存划分出一个缓冲区,一点一点的写入内存,缓冲区满了在写入硬盘。
stream
在java中把不同的输入源(键盘,文件,网络连接等)抽象的表述为stream 。通过流的形式允许java程序以相同的方式来访问不同的输入输出源。
流的分类
-
输入流:程序只能从输入流中获取信息。
-
输出流:程序只能从输出流中写入数据。
输入流主要由 InputStream 和 Reader 作为基类,输出流主要由 OutputStream 和 Writer 作为基类。它们都是抽象基类。
字节流和字符流
- 字节流 java中的字节流处理的基本单位是单个字节,它通常用来处理二进制数据
- 字符流 java中的字符流处理的基本单位是Unicode编码,大小是两个字节,他通常用来处理文本数据。
- 字符流和字节流
- 区别
- 字节流在操作是通常是不用缓冲区的(内存),是与文本直接进行操作的,而字符流在操作中的时候是要用到缓冲区的。字节流操作完成后不调用close()函数也能正常输出,而字符流不行。因为缓冲区时会强制把缓冲中的内容输出。当然调用fiash()方法也可以。
- 字节流能够处理任何类型的对象,而字符流只能处理字符或字符串。字节流提供了处理任何类型IO操作的功能,但是不能直接处理Unicode字符。
- 如果是音视频文件,图片等一般采用字节流,如果是关系到文本(中文),一般采用字符流。
- 字节流处理单元为一个字节,字符流为两个字节
Java操作的处理流程
- 使用file类打开一个文件
- 使用字节流或字符流的子类
- 进行读写操作
- 关闭输入输出
##举例
FileInputStream & FileOutputStream,实现文件拷贝
// 使用文件字节流 一次拷贝一个字节
private static void copyFile1(String src, String dest) throws IOException {
//1. 创建流
InputStream in = new FileInputStream(src);
OutputStream os = new FileOutputStream(dest);
//2. 读写数据
int data = in.read();
while (data != -1) {
os.write(data);
data = in.read();
}
//3. 关闭流
in.close();
os.close();
}
// 使用文件字节流 一次拷贝一个字节数组
private static void copyFile2(String src, String dest) throws IOException {
//1. 创建流
InputStream in = new FileInputStream(src);
OutputStream os = new FileOutputStream(dest);
//2. 读写数据
byte[] buffer = new byte[2048];
int len = in.read(buffer);
while (len != -1) {
os.write(buffer, 0, len);
len = in.read(buffer);
}
//3. 关闭流
in.close();
os.close();
}