一、IO流
1.1 什么是IO流
IO:为Input、Outout亦为输入输出
流:是一种抽象的概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质就是数据传输。
按照数据的流向
输入流:读数据
输出流:写数据
按照数据类型来分
字节流
字节输入流
字节输出流
字符流
字符输入流
字符输出流
1.2 IO流的使用场景
如果操作的是纯文本文件,优先使用字符流
如果操作的是图片、视频、音频等二进制文件。优先使用字节流
如果不确定文件类型,优先使用字节流。字节流是万能的流
二、字节流
2.1字节流的体系结构

2.2字节流的抽象基类
InputStream:这个抽象类是表示字节输入流的所有类的超类
OutputStream:这个抽象类是表示字节输出流的所有类的超类
子类名特点:子类名称都是以其父类名作为子类名的后缀
2.3数据写入的步骤
创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
调用字节输出流对象的写数据方法
释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
2.4字节输入流、输出流对象
由体系可知,输入、输出流又有着不带缓冲字节流和带缓冲的字节流
不带缓冲字节流:FileInputStream FileOutputStream
字节缓冲流:BufferedInputStream、BufferedOutputStream
2.4.1不带缓冲的字节流的构造
FileInputStream fis = new FileInputStream("文件 相对路径或绝对路径");
FileOutputStream fos = new FileOutputStream("文件相对路径或绝对路径");
2.4.2 字节缓冲流的构造
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件或者目录的 相对路径或绝对路径"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("文件或者目录的 相对路径或绝对路径"));
2.5字节流的写入、读取数据的方式
写入的方式有如下三种
方法名 | 说明 |
void write(int b) | 将指定的字节写入此文件输出流 一次写一个字节数据 |
void write(byte[] b) | 将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据 |
void write(byte[] b, int off, int len) | 将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据 |
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\fileDemo\\ok.txt");
fos.write(97);
byte[] bys ={'A','B'};
fos.write(bys);
byte[] bys1 ={'A','B','c'};
fos.write(bys1,1,2);
fos.close();
}
读取的方式有如下俩种
//一种是一个字节一个字节的读取
FileInputStream fis = new FileInputStream("D:\\fileDemo\\ok.txt");
int by;
while((by=fis.read())!=-1){
System.out.println((char)by);
}
fis.close();
//第二种是以字节数组的形式读取
FileInputStream fis = new FileInputStream("D:\\fileDemo\\ok.txt");
byte[] bys2 = new byte[1024];
int len;
while((len=fis.read(bys2))!=-1){
System.out.print(new String(bys2,0,len));
}
fis.close();
切记,流一当使用完毕,即直接关闭流
2.6字节缓冲流
字节缓冲流的写入和读取均和字节流一致,不过由于带有缓冲区,所以比字节流更快。
三、字符流
3.1字符流的体系结构

3.2字符流的抽象基类
Reader:这个抽象类是表示字符输入流的所有类的超类
Writer:这个抽象类是表示字符输出流的所有类的超类
子类名特点:子类名称都是以其父类名作为子类名的后缀
3.3什么是字符流
由于在字节流中操作中文效率不好,所以java提供了字符流。字符流=字节流+编码表
3.4字符串的编码解码
方法名 | 说明 |
byte[] getBytes() | 使用平台的默认字符集将该 String编码为一系列字节 |
byte[] getBytes(String charsetName) | 使用指定的字符集将该 String编码为一系列字节 |
String(byte[] bytes) | 使用平台的默认字符集解码指定的字节数组来创建字符串 |
String(byte[] bytes, String charsetName) | 通过指定的字符集解码指定的字节数组来创建字符串 |
底层的字节都为负数
3.5字符输入流、输出流对象
由体系可知,输入、输出流又有着不带缓冲字符流和带缓冲的字符流
不带缓冲字符流:InputStreamReader、OutputStreamWriter
字符缓冲流:BufferedReader、BufferedWriter
3.5.1不带缓冲的字符流的构造
InputStreamReader isr = new InputStreamReader(new FileInputStream("文件或者目录的 相对路径或绝对路径"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("文件或者目录的 相对路径或绝对路径"));
3.5.2 字符缓冲流的构造
BufferedReader br = new BufferedReader(new FileReader("文件的 相对路径或绝对路径"));
BufferedWriter bw = new BufferedWriter(new FileWriter("文件的 相对路径或绝对路径"));
3.6字符写入、读取数据的方式
字符流写入有五种
方法名 | 说明 |
void write(int c) | 写一个字符 |
void write(char[] cbuf) | 写入一个字符数组 |
void write(char[] cbuf, in0t off, int len) | 写入字符数组的一部分 |
void write(String str) | 写一个字符串 |
void write(String str, int off, int len) | 写一个字符串的一部分 |
这里偷个懒不演示了哈,大家可以下去尝试一下
读取的俩种方式
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\fileDemo\\g2.txt"));
int ch;
while ((ch=isr.read())!=-1) {
System.out.print((char)ch);
}
isr.close();
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\fileDemo\\g2.txt"));
char[] chs = new char[1024];
int len;
while ((len = isr.read(chs)) != -1) {
System.out.print(new String(chs, 0, len));
}
isr.close();
第一种是一个字符一个字符的读取,第二种是使用了字符数组。
而在字符缓冲流中,除了以上俩种读取,还可以如下
BufferedReader br = new BufferedReader(new FileReader("D:\\fileDemo\\g2.txt"));
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
br.close();