任务描述
本关任务:往给定文件的每行内容之间插入给定分隔符,并把添加分隔符的内容复制到给定的另一文件中。
相关知识
之前我们学习了 Reader(字符输入流)和 Writer (字符输出流),下面我们来了解一下它们的子类---BufferedReader (字符缓冲输入流)和 BufferedWriter(字符缓冲输出流)。
什么是 BufferedReader(字符缓冲输入流)
BufferedReader 是 Reader 的子类。它是一个带有缓冲区(默认大小 8k)的字符输入流,使用它可以提高我们的读取效率。当 BufferedReader 在读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区,之后在使用 read() 方法时,会先从缓冲区中进行读取,如果缓冲区数据不足,才会从文件中读取。
BufferedReader 的构造方法
下表是它的构造方法:
方法 | 描述 |
---|---|
BufferedReader(Reader in) | 创建一个使用默认大小输入缓冲区的缓冲字符输入流 |
BufferedReader(Reader in, int sz) | 创建一个使用指定大小输入缓冲区的缓冲字符输入流 |
构造方法使用示例:
public static void main(String[] args) throws IOException{
// 使用默认缓冲区大小创建字符缓冲流
BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\Users\\yy\\Desktop\\e.txt"));
// 使用指定缓冲区大小创建字符缓冲流
BufferedReader bufferedReader1 = new BufferedReader(new FileReader("C:\\Users\\yy\\Desktop\\e.txt"),1024);
}
BufferedReader 的常用方法
下表是它的常用方法:
方法 | 描述 |
---|---|
int read() | 读取单个字符 |
int read(char[] cbuf, int off, int len) | 将字符读入数组的某一部分,off 为数组偏移量,len 为写入字符长度 |
String readLine() | 读取一行文本 |
long skip(long n) | 跳过字符 |
boolean ready() | 判断此流是否已准备好被读取 |
close() | 关闭该流并释放与之关联的所有资源 |
mark(int readAheadLimit) | 标记流中的当前位置 |
markSupported() | 判断此流是否支持 mark() 操作 |
reset() | 将流重置到最新的标记 |
readLine() 方法使用示例:
public static void main(String[] args) throws IOException{
try(
// 使用默认缓冲区大小创建缓冲流
BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\Users\\yy\\Desktop\\e.txt"));) {
// 按行读取文件
while (true){
String s = bufferedReader.readLine();
if(null==s){
break;
}
// 输出文件内容
System.out.println(s);
}
}
}
已知 e.txt 文件中的内容为:
qqqqqqqqqqqqqqqqqqqq
sssssssssssssssssssssssss
kkkkkkkkkkkkkkkkkkkkkkkkkk
kkkkkkkkkkcmmmmmmmmm
dddddddddddddddddd
上述代码执行结果:
qqqqqqqqqqqqqqqqqqqq
sssssssssssssssssssssssss
kkkkkkkkkkkkkkkkkkkkkkkkkk
kkkkkkkkkkcmmmmmmmmm
dddddddddddddddddd
什么是 BufferedWriter(字符缓冲输出流)
BufferedWriter 是 Writer 的子类。它是一个带有缓冲区(默认大小 8k)的字符输出流,使用它可以提高我们的输出效率。使用 BufferedWriter 时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会将数据输出到目的地。
BufferedWriter 构造方法
下表是它的构造方法:
方法 | 描述 |
---|---|
BufferedWriter(Writer out) | 创建一个缓冲字符输出流,使用默认大小的输出缓冲区 |
BufferedWriter(Writer out, int sz) | 创建一个缓冲字符输出流,使用给定大小的输出缓冲区 |
我们可以看到它的构造方法和 BufferedReader 是一样的,这里我们就不再举例了。
BufferedWriter 常用方法
以下是它的常用方法:
方法 | 描述 |
---|---|
write(int c) | 写入单个字符 |
write(char[] cbuf, int off, int len) | 写入字符数组的某一部分,off 为数组偏移量,len 为写入字符长度 |
write(String s, int off, int len) | 写入字符串的某一部分,off 为字符串偏移量,len 为写入字符长度 |
newLine() | 写入一个行分隔符 |
close() | 关闭此流,但要先刷新它 |
flush() | 刷新该流的缓冲 |
常用方法使用示例:
public static void main(String[] args) throws IOException{
try(
// 使用默认缓冲区大小创建缓冲流
BufferedWriter writer=new BufferedWriter(new FileWriter("C:\\Users\\yy\\Desktop\\d.txt"));) {
//写入一个字符
char ch='好';
writer.write(ch);
//写入一个字符数组
String next="好学习";
char[] nexts=next.toCharArray();
writer.write(nexts,0,nexts.length);
//写入换行符
writer.newLine();
//写入一个字符串
String nextLine="天天向上";
writer.write(nextLine);
}
}
执行结果:往 d.txt 文件中写入了如下内容。
好好学习
天天向上
编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,往给定文件的每行内容之间插入给定分隔符,并把添加分隔符的内容复制到给定的另一文件中,具体要求如下:
- 接收给定的一行字符串(如:/test/a.txt,/testa1.txt,----。该字符串中第一部分内容为源文件路径,第二部分内容为目标文件路径,第三部分内容为分隔符);
- 在源文件中的每一行之间插入指定的分隔符,并把插入分隔符后的内容复制到目标文件中。
注意:给定字符串中的逗号为中文逗号。
import java.io.*;
import java.util.Scanner;
public class FileTest {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in); // 接收字符串
String next = scanner.nextLine();
// 请在Begin-End间编写完整代码
/********** Begin **********/
// 切割字符串
String[] str = next.split(",");
// 复制源文件内容到目标文件,并在每一行之间插入分隔符
BufferedReader bufferedReader = new BufferedReader(new FileReader(str[0]));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(str[1]));
String str1 = null;
while((str1 = bufferedReader.readLine()) != null){
bufferedWriter.write(str1);
bufferedWriter.newLine();
bufferedWriter.write(str[2]);
bufferedWriter.newLine();
}
bufferedReader.close();
bufferedWriter.close();
/********** End **********/
}
}