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

java获取三级行政 java获取当前代码行号_java获取三级行政

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");
  1. 创建字符流对象FileReader/Writer
//2.FileReader/Writer创建字符流对象
FileReader fr = new FileReader(f1);
FileWriter fw = new FileWriter(f2);
  1. 功能加强,在FileReader/Writer外面套一个管:BufferedReader/Writer
//3.功能加强,在FileReader/Writer外面套一个管:BufferedReader/Writer
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);
  1. 内容操作,复制内容
  1. 读取一个字符,输出一个字符
int n = br.read();
while(n!=-1){
	bw.write(n);
	n = br.read();
}
  1. 利用缓冲数组
char[] ch = new char[30];
int len = br.read(ch);
while(len!=-1){
	bw.write(ch,0,len);
	len = br.read(ch);
}
  1. 利用String读取
String str = br.readLine();//每次读取文本文件中一行,返回字符串
while(str!=null){
	bw.write(str);
	bw.newLine();//新起一行,在文本文件中写出一个换行
	str = br.readLine();
}
  1. 关闭流,倒着关闭,如果处理流包裹着节点流的话,那么其实只要关闭高级流(处理流),那么里面的字节流也会随之被关闭。
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();
 }
 }
 }
 }
 }