IO流的分类
按流向分:
输入流
输出流
按操作的类型分:
字节流
字符流
IO流的功能
将内容写入文件中,或者从文件中读取内容,强调的是内容。
IO流的结构图:
(一)字节流
字节输出流
FileOutputStream
使用字节输出流写出数据到文件:
1.创建文件字节输出流对象
FileOutputStream fos = new FileOutputStream("文件路径");
2.调用wirte方法写数据到文件
// 0 1 2 3 4
byte[] buf = {97, 98, 99, 100, 101};
// void write(byte[] b) 将一个字节数组写入文件中(一次性写多个)
fos.write(buf);
// 3.关闭文件.必须要做的
fos.close();
字节输入流
FileInputStream
使用字节输入流读取数据到程序:
FileInputStream fis = new FileIntpuStream("文件路径");
int ch = fis.read(); // 读取一个字节
byte[] buf = new byte[1024];
int len = fis.read(buf); // 读取一个字节数组
fis.close();
其中read(byte[])方法的原理:读取多个数据保存到byte[]中,返回读取的个数;
字节和字符之间转换
1.String转byte[]使用哪个方法?
String str = "你好,世界!";
byte[] buf = str.getBytes();
2.byte[]转String使用哪个方法?
byte[] bytes = {97, 98, 99, 100};
String str = new String(bytes);
(二)字符流
字符输出流
FileWirter
(一)使用FileWirter写数据到文件:
fr.wirte(字符);写入字符
fr.wirte(字符数组);写入字符数组
fr.wirte(字符数组,0, 个数);写入字符数组,并且可以选择写入开始位置,写入个数
fr.write(字符串);写入字符串
fr.write(字符串, 0, 个数);写入字符串,并且可以选择写入开始位置,写入个数
FileWriter fr = new FileWriter("文件路径");//创建文件字符输出流对象
fr.wirte('a');
fr.wirte(字符数组);
fr.wirte(字符数组,0, 个数);
fr.write(字符串);
fr.write(字符串, 0, 个数);
fr.close();//关闭流
(二FileWriter中关闭和刷新方法的区别:
flush: 刷新后还可以继续写数据。
close: close后不能再写数据, close也会刷新。
(三)FileWriter写数据实现换行和追加写
换行: “\r\n”
追加写: 构造方法append参数设置true
FileWriter fr = new FileWriter(“文件路径”, true);
字符输入流
FileReader
FileReader fr = new FileReader("文件路径");
int ch = fr.read(); // 读取一个字符
char[] chs = new char[1024];
int len = fr.read(chs);
// 读取一个字符数组的数据.读取到的多个数据保存chs数组中,返回读取到的个数。
(三) 缓冲流
缓冲流是对四个基本IO流的增强
BufferedInputStream 字节输入缓冲流
BufferedReader 字符输入缓冲流
BufferedOutputStream 字节输出缓冲流
BufferedWriter字符输出缓冲流
1.使用字节缓冲流读取数据到程序
BufferedInputStream bis = new BufferedIntpuStream(new FileInputStream(路径));
bis.read();
bis.close();
2.使用字节缓冲流写出数据到文件
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(路径));
bos.write(数据);
bos.close();
3.字符缓冲流和它的基本用法
字符缓冲流和字符缓冲流的用法基本相同,只是读取和写入的是字符。
//读取字符
BufferedReader br = new BufferedReader(new FileReader(路径));
br.read();
br.close();
//写入字符
BufferedWriter bw = new BufferedWriter(new FileWriter(路径));
bw.write(数据);
bw.close();
4.缓冲流的特殊用法
BufferedReader:
String readLine(); 读取一行数据
BufferedWriter:
void newLine(); 写一个换行符
(四) 转换流
InputStreamReader类构造方法
InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。
InputStreamReader(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。
charsetName: gbk/utf8 (大小写均可)
InputStreamReader类构造方法
InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。
InputStreamReader(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。
charsetName: gbk/utf8 (大小写均可)
1.使用转换流读取指定编码的文本文件
InputStreamReader isr = new InputStreamReader(new FileInputStream(路径), "GBK/UTF8");
isr.read();
isr.close();
2.使用转换流写入指定编码的文本文件
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(路径), "GBK/UTF8");
osw.write()
osw.close();
(五)序列化流
ObjectOutputStream对象序列化流
ObjectInputStream对象反序列化流
1.使用序列化流写出对象到文件
提前创建好一个基础的Student类
Student s = new Student("name", age);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(路径));
oos.writeObject(s);
oos.close();
2.使用反序列化流读取文件到程序中
提前创建好一个基础的Student类
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(路径));
Object obj = ois.readObject();
ois.close();
(六)IO异常处理
JDK7以前:
FileReader fr = null;
try {
fr = new FileReader("文件路径");
int ch = fr.read();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// null不能去调用方法
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
System.out.println("关闭流失败...");
}
}
}
JDK7以后:
JDK7及以后的处理方式
自动关流
try (能自动关流的代码/创建IO流的代码) {
其他代码
} catch(异常类名 变量名) {}
try (FileReader fr = new FileReader("文件路径");
FileWriter fw = new FileWriter("文件路径")
) {
int ch = fr.read();
System.out.println(ch);
} catch (FileNotFoundException e) {
System.out.println("文件没有找到");
} catch (IOException e) {
System.out.println("IO异常");
}