JAVA I/O流
I/O流概述
I/O流(Input/Output)流,即输入输出流,是Java中实现输入输出的基础,他可以方便地实现数据的输入输出操作。
I/O流可以简单分为三类
-
字节流和字符流
根据流操作的数据单位的不同,可以分为字节流和字符流。字节流以字节为单位进行数据的读写,每次读写一个或多个字节数据;字符流以字符为单位进行数据的读写,每次读写一个或者多个字符数据。
字符流只能够处理纯文本(中文)数据,其他类型数据不行,但是字符流处理文本要比字节流处理文本要方便。
-
输入流和输出流
根据流传输方向的不同,又可分为输入流和输出流。其中输入流只能从流中读取数据,而不能向其写入数据;输出流只能向流中写入数据,而不能从中读取数据。
-
节点流和处理流
根据流的功能不同,可以分为节点流和处理流。其中节点流也被称为低级流,是指可以从一个特定的I/O设备(如磁盘)读写数据的流,它只能直接连接数据源,进行数据的读写操作;处理流也被称为高级流,它用于对一个已存在的节点流进行连接和封装,通过封装后的流来实现流的读写能力。当使用处理流时,程序不会直接连接到实际的数据源,而是连接在已存在的流之上。
字节流
字节流:I/O流针对字节的输入输出提供的一系列流,分为字节输入流和字节输出流。
- inputStream:表示字节输入流所有类的超类
- OutputStream:表示输出流所有类的超类
- 子类名特点:子类名称都是以其父类名作为子类名的后缀
FileInputStream和FileOutputStream
- FileInputStream是InputStream的子类,他是操作文件的字节输入流,专门用于读取文件中的数据
- FileOutputStream是OutputStream的子类,他是操作文件的字节输出流,专门用于写入文件中的数据
- FileOutputStream向一个已经存在的文件中写入数据,那么该文件中的数据首先会被清空,再写入新的数据
方法声明 | 功能描述 |
---|---|
InputStream | |
read() | 从输入流中读取默认8字节,返回表示该字节的整数,当没有字节时返回-1 |
close() | 关闭此输入流并释放与该流关联的所有系统资源 |
OutputStream | |
write() | 向输出流写入默认1字节 |
flush() | 刷新此输出流并强制写出所有缓冲的输出字节 |
close() | 关闭此输入出流并释放与该流关联的所有系统资源 |
读写文件
package top.dty.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class FilePutStream01 {
public static void main(String[] args) throws IOException {
//创建一个文件字节输入流来读取文件
FileInputStream fileInputStream = new FileInputStream("test.txt");
//定义一个int类型的变量b
int b = 0;
//通过循环读取文件,当返回值为-1结束循环
while ((b = fileInputStream.read())!= -1){
System.out.println(b);
}
//I/O占用系统资源,使用完毕后要及时关闭
//关闭流
fileInputStream.close();
//FileOutputStream向一个已经存在的文件中写入数据,那么该文件中的数据首先会被清空,再写入新的数据
//创建文件输出流对象,并指定输出文件名称
FileOutputStream fileOutputStream = new FileOutputStream("out.txt");
//定义一个字符串
String str = "hello";
//将字符串转换为字节流数组进行写入
fileOutputStream.write(str.getBytes(StandardCharsets.UTF_8));
//关闭流
fileInputStream.close();
//append参数默认为false,控制文件写入是否覆盖,不覆盖为true
FileOutputStream fileOutputStream1 = new FileOutputStream("out.txt",true);
//定义一个字符串
String str1 = " word";
//将字符串转换为字节数组进行写入操作
fileOutputStream1.write(str1.getBytes(StandardCharsets.UTF_8));
//I/O遇到异常close()方法将无法执行
//为了保证I/O流的方法一定执行一般把关闭流放在finally代码块中
try {
if(fileOutputStream1 != null)
fileOutputStream1.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
文件拷贝
package top.dty.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FilePutStream02 {
public static void main(String[] args) throws IOException {
//创建文件输入流对象读取指定目录写的文件
FileInputStream in = new FileInputStream("C:\\Users\\段通瑶\\Desktop\\截图\\java.jpg");
//创建文件输出流对象将读取到的文件内容写入到指定目录的文件中
FileOutputStream out = new FileOutputStream("C:\\Users\\段通瑶\\Desktop\\截图\\666.jpg");
//定义一个int类型的变量 len
int len = 0;
//获取拷贝文件前的系统时间
long beginTime = System.currentTimeMillis();
//通过循环将读取到的文件字节信息写入到新文件
while ((len = in.read()) != -1){
out.write(len);
}
//获取拷贝文件花费时间
long endTime = System.currentTimeMillis();
//输出拷贝文件的时间
System.out.println((endTime-beginTime)+"ms");
//关闭流
in.close();
out.close();
}
}
字节流缓冲区
- 一个字节地读取,需要频繁地操作文件,这种效率非常低
- 为了提供传输效率,可以定义一个字节数组作为缓冲区
- 一次性读取多个字节的数据,将数据先保存在字节数组中,然后将字节数组中的数据一次性写入到新的文件中
package top.dty.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FilePutStream03 {
public static void main(String[] args) throws IOException {
//创建文件输入流对象读取指定目录写的文件
FileInputStream in = new FileInputStream("C:\\Users\\段通瑶\\Desktop\\截图\\java.jpg");
//创建文件输出流对象将读取到的文件内容写入到指定目录的文件中
FileOutputStream out = new FileOutputStream("C:\\Users\\段通瑶\\Desktop\\截图\\666.jpg");
//定义一个int类型的变量 len
int len = 0;
//定义一个长度为1024的字节数组
byte[] buff = new byte[1024];
//获取拷贝文件前的系统时间
long beginTime = System.currentTimeMillis();
//通过循环将读取到的文件字节信息写入到新文件
while ((len = in.read(buff)) != -1){
out.write(buff,0,len);
}
//获取拷贝文件花费时间
long endTime = System.currentTimeMillis();
//输出拷贝文件的时间
System.out.println((endTime-beginTime)+"ms");
//关闭流
in.close();
out.close();
}
}
字节缓存流(bufferedInputStream和bufferedOutputStream)
- BufferInputStream:创建一个内部缓冲区数组,当从内读取和跳过字节时,内部缓冲区根据需要从包含的输入流重新填充,一次多个字节
- BufferOutputStream:缓冲输出流。程序向底层输出流写字节,不必写每一个字节而导致底层系统的调用
- 这两个流内部都定义了一个大小为8192的字节数组
- 构造方法:
BufferInputStream(InputStream in):字节缓冲输入流
BufferOutputStream(OutputStream out):字节缓冲输出流
package top.dty.io