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