3. IO流
3.1 基本分类
- 按照读写数据的基本单位不同,分为 字节流 和 字符流。
- 其中字节流主要指以字节为单位进行数据读写的流,可以读写任意类型的文件。
- 其中字符流主要指以字符(2个字节)为单位进行数据读写的流,只能读写文本文件。
- 按照读写数据的方向不同,分为 输入流 和 输出流(站在程序的角度)。
- 其中输入流主要指从文件中读取数据内容输入到程序中,也就是读文件。
- 其中输出流主要指将程序中的数据内容输出到文件中,也就是写文件。
- 按照流的角色不同分为节点流和处理流。
- 其中节点流主要指直接和输入输出源对接的流。
- 其中处理流主要指需要建立在节点流的基础之上的流。
3.2 体系结构
3.3 相关流的详解
3.3.1 字符流
3.3.1.1 FileWriter类(重点)
(1)基本概念
java.io.FileWriter类主要用于将文本内容写入到文本文件。
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
FileWriter(String fileName) | 根据参数指定的文件名构造对象 |
FileWriter(String fileName, boolean append) | 以追加的方式根据参数指定的文件名来构造对象 |
void write(int c) | 写入单个字符 |
void write(char[] cbuf, int off, int len) | 将指定字符数组中从偏移量off开始的len个字符写入此文件输出流 |
void write(char[] cbuf) | 将cbuf.length个字符从指定字符数组写入此文件输出流中 |
void flush() | 刷新流 |
void close() | 关闭流对象并释放有关的资源 |
public class FileWriterTest {
public static void main(String[] args) {
//选中代码块,使用快捷键 crl+alt+t 可以自动生成捕获异常的代码
FileWriter fw= null;
try {
//1.构造FileWriter类型的对象并关联文件
//若文件不存在,则该流会自动创建新的空文件
//若文件存在,该流会清空原有数据内容
fw = new FileWriter("e:/a.txt");
//以追加的方式创建对象关联文件
//若文件不存在则创建新的空文件。若文件存在,则保留原有的数据内容
// fw = new FileWriter("e:/a.txt",true);
//2.通过流对象写入文件,每当写入一个字符文件中的读写位置则往后移一位
fw.write('a');
//准备一个字符数组
char[] cArr=new char[] {'h','e','l','l','o'};
//将字符数组的一部分写入文件
//写入从下标为1开始的3位字符
fw.write(cArr,1,3);
//将字符数组全部写入
fw.write(cArr);
//刷新
fw.flush();
System.out.println("数据写入成功!");
} catch (IOException e) {
e.printStackTrace();
} finally { //无论是否发生异常,finally都会运行
//3.关闭流对象并释放相关资源
if(null!=fw) { //如果fw不等于null就关闭
try {
fw.close(); //在new对象的过程中发生错误,对象无法new出来,会发生空指针异常
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.3.1.2 FileReader类(重点)
(1)基本概念
java.io.FileReader类主要用于从文本文件读取文本数据内容。
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
FileReader(String fileName) | 根据参数指定的文件名构造对象 |
int read() | 读取单个字符的数据并返回,返回-1表示读取到末尾 |
int read(char[] cbuf, int offset, int length) | 从输入流中将最多len个字符的数据读入一个字符数组中,返回读取到的字符个数,返回-1表示读取到末尾 |
int read(char[] cbuf) | 从此输入流中将最多 cbuf.length 个字符的数据读入字符数组中,返回读取到的字符个数,返回-1表示读取到末尾 |
void close() | 关闭流对象并释放有关的资源 |
FileReader fr= null;
try {
//1.构造对象关联文件
fr = new FileReader("e:/a.txt");
//2.读取文件内容并打印
/* int res=fr.read();
System.out.println("读取到的单个字符是:"+(char)res);*/
/*int res=0;
while ((res=fr.read())!=-1) { //当res=-1时,文件读取到末尾位置
System.out.println("读取到的单个字符是:"+(char)res);
}*/
//准备一个字符数组来存取数据内容
char[] cArr=new char[5];
//期望读满数组中一部分内容,读取文件中的3个字符从下标为1的位置开始存取
/* int res=fr.read(cArr,1,3);
System.out.println("字符的个数为:"+res); //3
for (char cs:cArr) {
System.out.println("读取到的单个字符为:"+(char)cs);//啥也没有 a e l 啥也没
}*/
//期望读满整个数组
int res=fr.read(cArr);
System.out.println("字符的个数为:"+res); //5
for (char cs:cArr) {
System.out.println("读取到的单个字符为:"+(char)cs);//a e l l h
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//3.关闭流对象
if (null!=fr){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
字符流实现文件的复制
public class FileCopyTest {
public static void main(String[] args) {
FileReader fr= null;
FileWriter fw= null;
try {
//1.创建一个FileReader类型的对象并与文件关联
fr = new FileReader("e:/a.txt");
//2.创建一个FileWriter类型的对象并与文件关联
fw = new FileWriter("e:/b.txt");
//3.从输入流当中读取文件并写入输出流中 //输入流是读文件 //输出流是写文件
System.out.println("正在拷贝...");
int res=0;
while ((res=fr.read())!=-1) {
fw.write(res);
}
System.out.println("文件拷贝成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流文件并释放相关资源
try {
if (null!=fw)
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (null!=fr)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.3.1.3 BufferedWriter类(重点)
(1)基本概念
java.io.BufferedWriter类主要用于写入单个字符、字符数组以及字符串到输出流中。
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
BufferedWriter(Writer out) | 根据参数指定的引用来构造对象 |
BufferedWriter(Writer out, int sz) | 根据参数指定的引用和缓冲区大小来构造对象 |
void write(int c) | 写入单个字符到输出流中 |
void write(char[] cbuf, int off, int len) | 将字符数组cbuf中从下标off开始的len个字符写入输出流中 |
void write(char[] cbuf) | 将字符串数组cbuf中所有内容写入输出流中 |
void write(String s, int off, int len) | 将参数s中下标从off开始的len个字符写入输出流中 |
void write(String str) | 将参数指定的字符串内容写入输出流中 |
void newLine() | 用于写入行分隔符到输出流中 |
void flush() | 刷新流 |
void close() | 关闭流对象并释放有关的资源 |
3.3.1.4 BufferedReader类(重点)
(1)基本概念
java.io.BufferedReader类用于从输入流中读取单个字符、字符数组以及字符串。
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
BufferedReader(Reader in) | 根据参数指定的引用来构造对象 |
BufferedReader(Reader in, int sz) | 根据参数指定的引用和缓冲区大小来构造对象 |
int read() | 从输入流读取单个字符,读取到末尾则返回-1,否则返回实际读取到的字符内容 |
int read(char[] cbuf, int off, int len) | 从输入流中读取len个字符放入数组cbuf中下标从off开始的位置上,若读取到末尾则返回-1,否则返回实际读取到的字符个数 |
int read(char[] cbuf) | 从输入流中读满整个数组cbuf |
String readLine() | 读取一行字符串并返回,返回null表示读取到末尾 |
void close() | 关闭流对象并释放有关的资源 |
public class BufferedCharCopyTest {
public static void main(String[] args) {
BufferedReader br= null;
BufferedWriter bw= null;
try {
//1.创建一个BufferedReader类型的对象并关联文件
br = new BufferedReader(new FileReader("e:/a.txt"));
//2.创建一个BufferedWriter类型的对象并关联文件
bw = new BufferedWriter(new FileWriter("e:/b.txt"));
//3.从输入流中读取一行字符串并写入输出流中
System.out.println("拷贝中...");
String str=null;
while ((str=br.readLine())!=null) {
bw.write(str);
bw.newLine(); //写入分隔符; 当前系统的分隔符是: \r \n
}
System.out.println("拷贝成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流对象
if (null!=br){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null!=bw){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.3.1.5 PrintWriter类
(1)基本概念
java.io.PrintWriter类主要用于将对象的格式化形式打印到文本输出流。
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
PrintWriter(Writer out) | 根据参数指定的引用来构造对象 |
void print(String s) | 将参数指定的字符串内容打印出来 |
void println(String x) | 打印字符串后并终止该行 |
void flush() | 刷新流 |
void close() | 关闭流对象并释放有关的资源 |
3.3.1.6 转换流
(1) OutputStreamWriter类
-
基本概念
java.io.OutputStreamWriter类主要用于实现从字符流到字节流的转换。 -
常用的方法
方法声明 功能介绍 OutputStreamWriter(OutputStream out) 根据参数指定的引用来构造对象 OutputStreamWriter(OutputStream out, String charsetName) 根据参数指定的引用和编码构造对象 void write(String str) 将参数指定的字符串写入 void flush() 刷新流 void close() 用于关闭输出流并释放有关的资源
(2)InputStreamReader类
-
基本概念
java.io.InputStreamReader类主要用于实现从字节流到字符流的转换。 -
常用的方法
方法声明 功能介绍 InputStreamReader(InputStream in) 根据参数指定的引用来构造对象 InputStreamReader(InputStream in, String charsetName) 根据参数指定的引用和编码来构造对象 int read(char[] cbuf) 读取字符数据到参数指定的数组 void close() 用于关闭输出流并释放有关的资源