天天看点

21、java.io.BufferedWriter字符缓冲流

一、BufferedWriter

  1. 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 
  2. 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。 
  3. 该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。
  4. 并非所有平台都使用新行符 ('\n') 来终止各行。
  5. 因此调用此方法来终止每个输出行要优于直接写入新行符。 
  6. 通常 Writer 将其输出立即发送到底层字符或字节流。
  7. 除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。
  8. 例如, PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
  9. 将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的
public class BufferedWriter extends Writer
{
	//创建一个使用默认大小输出缓冲区的缓冲字符输出流
	public BufferedWriter(Writer out){}

	//创建一个使用给定大小输出缓冲区的新缓冲字符输出流
	public BufferedWriter(Writer out,
                      int sz){}

	//写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 ('\n') 符
	public void newLine()
             throws IOException{}
}
           

二、BufferedReader

  1. 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 
  2. 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。 
  3. 通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。
  4. 因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。
  5. 例如,BufferedReader in = new BufferedReader(new FileReader("foo.in"));
  6. 将缓冲指定文件的输入。
  7. 如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。 
  8. 通过用合适的 BufferedReader 替代每个 DataInputStream,可以对将 DataInputStream 用于文字输入的程序进行本地化。
public class BufferedReader extends Reader
{
	//创建一个使用默认大小输入缓冲区的缓冲字符输入流8192byte即8kb
	public BufferedReader(Reader in){}

	//创建一个使用指定大小输入缓冲区的缓冲字符输入流
	public BufferedReader(Reader in,
                      int sz){}

	//读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行
	//返回包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null 
	public String readLine()
                throws IOException{}
}
           

  三、这里用到了装饰设计模式   四、LineNumberReader  

  1. 跟踪行号的缓冲字符输入流。
  2. 此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。 
  3. 默认情况下,行编号从 0 开始。该行号随数据读取在每个行结束符处递增,并且可以通过调用 setLineNumber(int) 更改行号。
  4. 但要注意的是,setLineNumber(int) 不会实际更改流中的当前位置;它只更改将由 getLineNumber() 返回的值。 
  5. 可认为行在遇到以下符号之一时结束:换行符('\n')、回车符('\r')、回车后紧跟换行符。
public class LineNumberReader extends BufferedReader
{
	//使用默认输入缓冲区的大小创建新的行编号 reader
	public LineNumberReader(Reader in){}

	//创建新的行编号 reader,将字符读入给定大小的缓冲区
	public LineNumberReader(Reader in,
                        int sz){}

	//获得当前行号。
	public int getLineNumber(){}

	//设置当前行号。
	public void setLineNumber(int lineNumber){}
}
           

五、示例

import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class Test {

	public static void main(String[] args) throws IOException {
		FileReader fr = new FileReader("E:\\f\\eclipse\\artifacts.xml");
		LineNumberReader lnr = new LineNumberReader(fr);
		String line = null;
		int num = 0;
		while((line=lnr.readLine())!=null)
		{
			num = lnr.getLineNumber();
			System.out.println(num+"::"+line);
		}
	}
}
           

继续阅读