字符流的缓冲区
1.缓冲区的出现提高了对数据的读写效率。
2.对应类
BufferedWriter
BufferedReader
3.缓冲区要结合流才可以使用。
4.在流的基础上对流的功能进行了增强。
BufferedWriter(字符写入流缓冲区)
特点:
1.缓冲区中提供了一个跨平台的换行符。newLine();
2.close方法会在关闭该输入流之前先刷新一下该缓冲流
3.关闭缓冲区,就是在关闭缓冲区中的流对象。
BufferedWriter实例:
BufferedReader(字符读取流缓冲区)
特有方法:
readLine:读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
返回:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
BufferedReader实例:
文本文件复制(通过缓冲区)
1.缓冲区的出现提高了对数据的读写效率。
2.对应类
BufferedWriter
BufferedReader
3.缓冲区要结合流才可以使用。
4.在流的基础上对流的功能进行了增强。
BufferedWriter(字符写入流缓冲区)
特点:
1.缓冲区中提供了一个跨平台的换行符。newLine();
2.close方法会在关闭该输入流之前先刷新一下该缓冲流
3.关闭缓冲区,就是在关闭缓冲区中的流对象。
BufferedWriter实例:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/*
* 缓冲区的出现是为了提高流的操作效率而出现的。
*/
public class BufferedWriterDemo {
public static void main(String[] args) {
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw = new FileWriter("HelloWorld.txt");
//为了提高字符写入流效率。加入了缓冲技术。
//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函
数即可。
bw = new BufferedWriter(fw);
bw.write("BufferedWrited demo");
//写入一个跨平台的换行符.
bw.newLine();
//记住,只要用到缓冲区,就要记得刷新。
bw.flush();
bw.write("Java");
} catch (IOException e) {
System.out.println("数据写入失败");
} finally{
if (bw!=null) {
try {
//其实关闭缓冲区,就是在关闭缓冲区中的流对
象。
bw.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
if (fw!=null) {
try {
fw.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
BufferedReader(字符读取流缓冲区)
特有方法:
readLine:读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
返回:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
BufferedReader实例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/*
* 字符读取流缓冲区
*/
public class BufferedReaderDemo {
public static void main(String[] args) {
FileReader fr = null;
BufferedReader br = null;
try{
fr = new FileReader("HelloWorld.txt");
br = new BufferedReader(fr);
String line;
while((line = br.readLine()) != null){
System.out.println(line);
}
} catch(IOException e){
System.out.println("读取失败");
} finally{
if (br!=null) {
try {
//其实关闭缓冲区,就是在关闭缓冲区中的流对象。
br.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}else if (fr!=null) {
try {
fr.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
文本文件复制(通过缓冲区)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
* 通过缓冲区复制文件
*/
public class CopyTextBuffered {
public static void main(String[] args){
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new FileReader("HelloWorld.txt"));
bw = new BufferedWriter(new FileWriter("HelloWorld_copy.txt"));
String line;
while((line = br.readLine()) != null){
bw.write(line);
bw.newLine();
}
} catch (IOException e) {
System.out.println("复制失败");
} finally{
if(br!=null){
try {
br.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
if(bw!=null){
try {
bw.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
readLine的原理:
不论是读一行,获取多个字符,其实最终都是在硬盘上一个一个读取,所以最终使用的还是 read() 方法一次读一个的方法。
因为跨平台性,换行符不一样,所以读取的时候缓存中不存入换行,让使用者自己输入换行。
模拟BufferedReader中的readLine方法
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/*
明白了BufferedReader类中特有方法readLine的原理后,
可以自定义一个类中包含一个功能和readLine一致的方法。
来模拟一下BufferedReader
*/
//模拟BufferedReader
class MyBufferedReader extends Reader{
private Reader r;
MyBufferedReader(Reader r) {
this.r = r;
}
//readLine
public String readLine() throws IOException{
//定义一个临时容器。原BufferReader封装的是字符数组。
//为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。
StringBuilder sb = new StringBuilder();
int ch;
while((ch = r.read())!=-1){
if(ch=='\r'){
continue;
}
if(ch=='\n'){
return sb.toString();
}else{
sb.append((char)ch);
}
}
if(sb.length() == 0){
return null;
}
return sb.toString();
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
// TODO Auto-generated method stub
return r.read(chuf,off,len);
}
@Override
public void close() throws IOException {
// TODO Auto-generated method stub
r.close();
}
}
public class MyBufferedReaderDemo {
public static void main(String[] args) {
MyBufferedReader br = null;
try {
br = new MyBufferedReader(new FileReader("HelloWorld.txt"));
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("读取失败");
} finally{
try {
br.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}