一、按照流向分
输入流: 只能从中读取数据,而不能向其写入数据。
输出流:只能向其写入数据,而不能向其读取数据。
二、按照操作单元分
字节流:是一个字节一个字节的读取或写入
字符流:是一个字符一个字符的读取或写入,一个字符就是两个字节,主要用来处理字符。
三、按照角色划分
节点流:直接从/向一个特定的IO设备(如磁盘,网络)读/写数据的流,称为节点流。
处理流:“连接”在已存在的流(节点流或处理流)之上通过对数据的处理为程序提供更为强大的读写功能的流。
四、输入/输出流体系中常用的流的分类表
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
访问字符串 | StringReader | StringWriter | ||
缓冲流(处理) | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
操作对象 | ObjectInputStream | ObjectOutputStream |
五、流怎么用
5.1、输入流
// InputStream本身是抽象类,我们需要使用它的子类去构造对象:
InputStream inputStream = new FileInputStream(file);
// 读一个字节
int read = inputStream.read();
// 一次性读1024个字节到那个内存数组
int read = inputStream.read(new byte[1024]);
// 从第0个字节开始读,读120个字节
int read = inputStream.read(new byte[1024],0,120);
read是一个字节一个字节的读,读到-1是结束符
InputStream inputStream = new FileInputStream("D:/code/a.txt");
int read;
while ((read =inputStream.read()) != -1){
System.out.print(read+" ");
}
5.2、输出流
在定义文件输出流时,有两个参数,第二个如果是true代表追加文件,如果false代表覆盖文件,意思就是如果人家这个文件原来有内容,就覆盖的没了,这一点要注意。
OutputStream outputStream = new FileOutputStream("D:/code/a.txt",true);
// 一个字节一个字节的写
outputStream.write(97);
@Test
public void OuputTest() throws IOException {
File file = new File("/E:/temp/a.txt");
OutputStream outputStream = new FileOutputStream(file,true);
outputStream.write("OK".getBytes(StandardCharsets.UTF_8));
}
5.3、注意的点
1、绝大部分的对IO的操作都需要处理可能出现的IO异常。
2、我们发现不管是inputStream还是outputStream都有一个close方法,IO是需要消耗系统资源的,每一个stream都需要系统分配资源,是弥足珍贵的,所以没有流一旦使用完成就一定要关闭资源。