什么是字符流
对于文本文件(.txt .java .c .cpp) 使用字符流处理
注意点
- 读入的文件一定要存在 否则就会报FileNotFoundException
- 异常的处理 为了保证流资源 一定可以执行关闭操作 要使用try catch finally 来操作
- 写出的文件如果不存在 会自动创建
- 实例化FileWriter 处理File参数 还有append参数
append :false 覆盖原有文件 append :true 在原有文件后面追加
示例
package day03;
import org.junit.Test;
import java.io.*;
/**
* 一.流的分类
* 1. 数据单位 :字节流 字符流
* 2. 流向: 输入流 输出流
* 3. 角色:节点流 处理流
* <p>
* 二.体系结构
* 抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
* InputStream FileInputStream BufferedInputStream
* OutputStream FileOutputStream BufferedOutputStream
* Reader FileReader BufferedReader
* Writer FileWriter BufferedWriter
*/
public class FileReaderWriter {
/**
* 将 hello.txt 读取到 内存中 并输出到控制台 (一个一个读)
* <p>
* 异常的处理 为了保证流资源 一定可以执行关闭操作 要使用try catch finally 来操作
* <p>
* 读入的文件一定要存在 否则就会报FileNotFoundException
*/
@Test
public void testFileReader() {
FileReader fileReader = null;
try {
// 1. 实例化file对象 确定要操作的文件
File file = new File("08_IO\\hello");
if (!file.exists()) {
System.out.println("file不存在");
return;
}
// 2. 提供具体的流
fileReader = new FileReader(file);
// 3. 数据的读入
// read() 返回读入的一个字符 如果达到文件末尾 返回 -1
int n;
while ((n = fileReader.read()) != -1) {
System.out.println((char) n);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileReader != null) {
// 4. 流的关闭 节省资源
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 使用read重载方法
*/
@Test
public void testFileReader1() {
FileReader fileReader = null;
try {
// 1. File类的实例化
File file = new File("08_IO\\hello");
// 2. FileReader的实例化
fileReader = new FileReader(file);
// 3. 读入的操作
char[] ch = new char[10];
int len;
while ((len = fileReader.read(ch)) != -1) {
/*
* 错误的写法
* */
// for (int i = 0; i < ch.length; i++) {
// System.out.print(ch[i]);
// }
/*
* 正确的写法
* 第一种写法
* */
// for (int i = 0; i < len; i++) {
// System.out.print(ch[i]);
// }
// 第二种写法
String string = new String(ch, 0, len);
System.out.print(string);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4. 资源关闭
try {
if (fileReader != null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 从内存写出到硬盘的文件里
* <p>
* 写出的文件如果不存在 会自动创建
* 如果存在 对原有文件内容的覆盖
*/
@Test
public void testFileWriter() {
FileWriter fileWriter = null;
try {
// 1. 实例化File类对象
File file = new File("08_IO\\hello1");
// 2.提供FileWriter 对象 用于数据的写出
// append :false 覆盖原有文件
// append :true 在原有文件后面追加
fileWriter = new FileWriter(file, true);
// 3. 写出的操作
fileWriter.write("wwbao");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4. 关闭流操作
try {
if (fileWriter != null) {
fileWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 复制文件
* <p>
* 利用FileReader 读取文件
* FileWriter 写入文件
*/
@Test
public void testFileReaderFileWriter() {
FileWriter fw = null;
FileReader fr = null;
try {
// 1. 创建File类对象
File srcFile = new File("08_IO\\hello1");
File destFile = new File("08_IO\\hello2");
// 2. 创建FileReader 和 FileWriter对象
fr = new FileReader(srcFile);
fw = new FileWriter(destFile);
// 3. 读取文件 写入文件
char[] ch = new char[10];
int len;
while ((len = fr.read(ch)) != -1) {
fw.write(ch, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4. 关闭资源
try {
if (fw != null) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fr != null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
小结
具体的操作跟字节流类似
实现类不同
对于文本文件
(.txt .java .c .cpp) 使用字符流
处理
对于非文本文件
(.jpg .mp3 .mp4 .doc .ppt) 使用字节流
处理