java IO流之缓冲字符流BufferedReader BufferedWriter 方法 实例 LineNumberReader加行号

java IO流之缓冲字符流BufferedReader BufferedWriter 方法 实例 LineNumberReader加行号

在这里插入图片描述

BufferedReader

  • 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
  • 建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。

构造方法摘要

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

方法

Modifier and Type Method Description
void close() 关闭该流并释放与之关联的所有资源。
void mark(int readAheadLimit) 标记流中的当前位置。
boolean markSupported() 判断此流是否支持 mark() 操作(它一定支持)。
int read() 读取单个字符。
int read(CharBuffer target) 将字符读入指定的字符缓冲区。
int read(char[] cbuf) 将字符读入数组。
int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
String readLine() 读取一个文本行。
boolean ready() 判断此流是否已准备好被读取。
void reset() 将流重置到最新的标记。
long skip(long n) 跳过n个字符。返回实际跳过的字符数
  • 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

LineNumberReader

java.lang.Object

java.io.Reader

java.io.BufferedReader

java.io.LineNumberReader

BufferedReader直接子类

  • 跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int)getLineNumber(),它们可分别用于设置和获取当前行号。

    • public int getLineNumber()获得当前行号。
    • public void setLineNumber(int lineNumber) 设置当前行号。
  • 默认情况下,行编号从 0 开始。该行号随数据读取在每个行结束符处递增,并且可以通过调用 setLineNumber(int) 更改行号。但要注意的是,setLineNumber(int) 不会实际更改流中的当前位置;它只更改将由 getLineNumber() 返回的值。

  • 可认为行在遇到以下符号之一时结束:换行符(’\n’)、回车符(’\r’)、回车后紧跟换行符。

BufferedWriter

  • 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
  • 该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 (’\n’) 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。

  • 通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)

构造方法摘要

  • BufferedWriter(Writer out)
    • 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
  • BufferedWriter(Writer out, int sz)
    • 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

方法摘要

Modifier and Type Method Description
void close() 关闭此流,但要先刷新它。
void flush() 刷新该流的缓冲。
void newLine() 写入一个行分隔符。
void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
void write(int c) 写入单个字符。
void write(String s, int off, int len) 写入字符串的某一部分。
void write(char[] cbuf) 写入字符数组cbuf
void write(String str) 写入字符串str
Write append(char c) 将指定字符c添加到此 writer。
Writer append(CharSequence csq) 将指定字符序列csq添加到此 writer。
Writer append(CharSequence csq, int start, int end) 将指定字符序列的子序列添加到此 writer。
  • 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

分步实现

  1. 创建源文件与目标文件实例

    //1.创建源文件与目标文件实例
    File f1 = new File("IOStream/src/testfile/test.txt");
    File f2 = new File("IOStream/src/testfile/demo.txt");
    
  2. 创建字符流对象FileReader/Writer

    //2.FileReader/Writer创建字符流对象
    FileReader fr = new FileReader(f1);
    FileWriter fw = new FileWriter(f2);
    
  3. 功能加强,在FileReader/Writer外面套一个管:BufferedReader/Writer

    //3.功能加强,在FileReader/Writer外面套一个管:BufferedReader/Writer
    BufferedReader br = new BufferedReader(fr);
    BufferedWriter bw = new BufferedWriter(fw);
    
  4. 内容操作,复制内容

    1. 读取一个字符,输出一个字符

      int n = br.read();
      while(n!=-1){
              
              
      	bw.write(n);
      	n = br.read();
      }
      
    2. 利用缓冲数组

      char[] ch = new char[30];
      int len = br.read(ch);
      while(len!=-1){
              
              
      	bw.write(ch,0,len);
      	len = br.read(ch);
      }
      
    3. 利用String读取

      String str = br.readLine();//每次读取文本文件中一行,返回字符串
      while(str!=null){
              
              
      	bw.write(str);
      	bw.newLine();//新起一行,在文本文件中写出一个换行
      	str = br.readLine();
      }
      
  5. 关闭流,倒着关闭,如果处理流包裹着节点流的话,那么其实只要关闭高级流(处理流),那么里面的字节流也会随之被关闭。

    bw.close();
    br.close();
    

综合程序

内容复制程序

使用try-catch-finally异常处理
public class TestTC {
    
    
    public static void main(String[] args) {
    
    
        //1.创建源文件与目标文件实例
        File f1 = new File("IOStream/src/testfile/test.txt");
        File f2 = new File("IOStream/src/testfile/demo.txt");
        //2.FileReader/Writer创建字符流对象
        FileReader fr = null;
        FileWriter fw = null;
        //3.功能加强,在FileReader/Writer外面套一个管:BufferedReader/Writer
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
    
    
            fr = new FileReader(f1);
            fw = new FileWriter(f2);
            br = new BufferedReader(fr);
            bw = new BufferedWriter(fw);
            //4.开始动作:读取String:
            String str = br.readLine();//每次读取文本文件中一行,返回字符串
            while (str != null) {
    
    
                bw.write(str);
                bw.newLine();//新起一行,在文本文件中写出一个换行
                str = br.readLine();
            }
        } catch (FileNotFoundException e) {
    
    
            e.printStackTrace();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            //5.关闭流
            try {
    
    
                if (bw != null) {
    
    
                    bw.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
            try {
    
    
                if (br != null) {
    
    
                    br.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}
使用try-with-resource
public class TestTC {
    
    
    public static void main(String[] args) {
    
    
        //1.创建源文件与目标文件实例
        File f1 = new File("IOStream/src/testfile/test.txt");
        File f2 = new File("IOStream/src/testfile/demo.txt");
        try (
                //2.FileReader/Writer创建字符流对象
                FileReader fr = new FileReader(f1);
                FileWriter fw = new FileWriter(f2);
                //3.功能加强,在FileReader/Writer外面套一个管:BufferedReader/Writer
                BufferedReader br = new BufferedReader(fr);
                BufferedWriter bw = new BufferedWriter(fw);
                ){
    
    
            //4.开始动作:读取String:
            String str = br.readLine();//每次读取文本文件中一行,返回字符串
            while (str != null) {
    
    
                bw.write(str);
                bw.newLine();//新起一行,在文本文件中写出一个换行
                str = br.readLine();
            }
        } catch (FileNotFoundException e) {
    
    
            e.printStackTrace();
            System.out.println("找不到文件");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

LineNumberReader

搭配LineNumberReader给文件下指定类型文件加行号

public class ALineN {
    
    
    public static void main(String[] args) {
    
    
        String outfilename = "IOStream/src/testfile/collection.txt"; //输出的文件
        File dir = new File("IOStream/src/testfile/"); //源文件夹
        File[] files = dir.listFiles(name -> name.getName().endsWith(".txt"));//lambda 表达式,指定要处理的文件类型
        assert files != null;
        if (files.length == 0) {
    
    
            System.out.println("文件内容为空");
        } else {
    
    
            for (File file : files) {
    
    
                String line = null;
                try (FileReader freader = new FileReader(file);
                     FileWriter fwriter = new FileWriter(outfilename, true);
                     LineNumberReader lnread = new LineNumberReader(freader);
                     BufferedWriter bWriter = new BufferedWriter(fwriter)) {
    
    
                    while ((line = lnread.readLine()) != null) {
    
    
                        bWriter.write("line " + lnread.getLineNumber() + ": " + line + "\t\n");
                    }
                } catch (FileNotFoundException ex) {
    
    
                    ex.printStackTrace();
                    System.out.println("找不到文件");
                } catch (IOException ex) {
    
    
                    ex.printStackTrace();
                }
            }
        }
    }
}

catch (FileNotFoundException ex) {
ex.printStackTrace();
System.out.println(“找不到文件”);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
}




猜你喜欢

转载自blog.csdn.net/m0_46530662/article/details/119709413