学习-Java输入输出之字符缓冲IO流之往文件中插入分隔符

任务描述

本关任务:往给定文件的每行内容之间插入给定分隔符,并把添加分隔符的内容复制到给定的另一文件中。

相关知识

之前我们学习了 Reader(字符输入流)和 Writer (字符输出流),下面我们来了解一下它们的子类---BufferedReader (字符缓冲输入流)和 BufferedWriter(字符缓冲输出流)。

什么是 BufferedReader(字符缓冲输入流)

BufferedReader 是 Reader 的子类。它是一个带有缓冲区(默认大小 8k)的字符输入流,使用它可以提高我们的读取效率。当 BufferedReader 在读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区,之后在使用 read() 方法时,会先从缓冲区中进行读取,如果缓冲区数据不足,才会从文件中读取。

BufferedReader 的构造方法

下表是它的构造方法:

方法 描述
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流

构造方法使用示例:

  1. public static void main(String[] args) throws IOException{
  2. // 使用默认缓冲区大小创建字符缓冲流
  3. BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\Users\\yy\\Desktop\\e.txt"));
  4. // 使用指定缓冲区大小创建字符缓冲流
  5. BufferedReader bufferedReader1 = new BufferedReader(new FileReader("C:\\Users\\yy\\Desktop\\e.txt"),1024);
  6. }

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() 方法使用示例:

  1. public static void main(String[] args) throws IOException{
  2. try(
  3. // 使用默认缓冲区大小创建缓冲流
  4. BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\Users\\yy\\Desktop\\e.txt"));) {
  5. // 按行读取文件
  6. while (true){
  7. String s = bufferedReader.readLine();
  8. if(null==s){
  9. break;
  10. }
  11. // 输出文件内容
  12. System.out.println(s);
  13. }
  14. }
  15. }

已知 e.txt 文件中的内容为:

  1. qqqqqqqqqqqqqqqqqqqq
  2. sssssssssssssssssssssssss
  3. kkkkkkkkkkkkkkkkkkkkkkkkkk
  4. kkkkkkkkkkcmmmmmmmmm
  5. dddddddddddddddddd

上述代码执行结果:

  1. qqqqqqqqqqqqqqqqqqqq
  2. sssssssssssssssssssssssss
  3. kkkkkkkkkkkkkkkkkkkkkkkkkk
  4. kkkkkkkkkkcmmmmmmmmm
  5. 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() 刷新该流的缓冲

常用方法使用示例:

  1. public static void main(String[] args) throws IOException{
  2. try(
  3. // 使用默认缓冲区大小创建缓冲流
  4. BufferedWriter writer=new BufferedWriter(new FileWriter("C:\\Users\\yy\\Desktop\\d.txt"));) {
  5. //写入一个字符
  6. char ch='好';
  7. writer.write(ch);
  8. //写入一个字符数组
  9. String next="好学习";
  10. char[] nexts=next.toCharArray();
  11. writer.write(nexts,0,nexts.length);
  12. //写入换行符
  13. writer.newLine();
  14. //写入一个字符串
  15. String nextLine="天天向上";
  16. writer.write(nextLine);
  17. }
  18. }

执行结果:往 d.txt 文件中写入了如下内容。

  1. 好好学习
  2. 天天向上

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 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 **********/
    }
}

 

你可能感兴趣的:(java)