一、初识IO流
File:创建文件,目录,但是文件的内容无法操作
对文件的内容进行操作,使用IO流
注意:管道并不是真实存在的
IO流: 一般都是成双成对: 有一个xx输入流, 对应有一个xx输出流
输入流: 接收数据, 读操作
输出流: 发送数据,写操作 读入写出
IO的父类组成:四大抽象类组成:
二、IO流的分类
按流向分:
◦ 输入流:程序可以从中读取数据的流
◦ 输出流:程序能向其中写入数据的流
按数据传输单位分:
◦ 字节流:以字节为单位传输数据的流
◦ 字符流:以字符为单位传输数据的流
按功能分:
◦ 节点流:用于直接操作目标设备的流
◦ 处理流:是对一个已存在的流的连接和封装,通过对数据的处理为程序提供更强大、灵活的读写功能。
节点流: 直接接在源头的流, 不需要依赖其他流
字节的节点流: 万能流(不管是什么文件(视频、音频、文本)都能进行读写)
FileInputStream: 文件字节输入流, 源头接在文件, 把文件的内容读取到内存(程序)
FileOutputStream: 文件字节输出流: 把内存(程序)的数据写入到文件
字符节点流: 只能文本文件读写
FileReader: 文件字符输入流, 源头接在文件, 把文件的内容读取到内存(程序)
FileWriter: 文件字符输出流: 把内存(程序)的数据写入到文件
输入流:
read() 读方法
close() 关闭
输出流:
write() 写方法
close() 关闭
IO流使用步骤:
创建一个IO对象
如果输入流,调用read() 读取数据, 如果是输出流: 调用write() 写数据
关闭
字节输入流:FileInputStream
构造方法:
为什么fis已经在new FileInputStream()的时候初始化了,还要进行赋值等于null呢?
因为在初始化的时候会有个FileNotFoundException异常,如果发生了异常,try{}
里面的内容根本就不会执行,所以file就不会进行初始化,也就没有赋值,所以在一开始要让fis等于null;
为什么fis.close要放在finally里面呢?
因为打印后,read()方法会出现异常,万一出现了异常,fis.close() 就不会执行,也就关不了,而放在finally里面,无论抛不抛出异常,最终都会关闭fis.
运行结果:
为什么汉字变成这样了呢?
因为这是字节流,他是一个字节一个字节的读的,而汉字是两个字节,所以只读了一半,打印出来就乱套了。
所以,我们使用字符流来读:
package com.fs.javase;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class IODemo2 {
public static void main(String[] args) {
FileReader fr =null;
//创建对象
File file = new File("C:\\test\\c.txt");
//读取文件
try {
fr = new FileReader(file);
//int rs = fr.read();
int rs = -1;//读到文件末尾
//当没有读到文件末尾
while ((rs=fr.read()) != -1){
System.out.print((char)rs);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果: