字符流缓冲区

来源:互联网 发布:dnftgp角色数据不更新 编辑:程序博客网 时间:2024/05/17 22:54

缓冲区的出现是为了提高流的操作效率而出现的,所以在创建缓冲区之前,必须要先有流对象。
该缓冲区中提供了一个跨平台的换行符。newLine();

1.BufferedWriter示例:

import java.io.*;class  BufferedWriterDemo{public static void main(String[] args) throws IOException{//创建一个字符写入流对象。FileWriter fw = new FileWriter("buf.txt");//为了提高字符写入流效率。加入了缓冲技术。//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。BufferedWriter bufw = new BufferedWriter(fw);for(int x=1; x<5; x++){bufw.write("abcd"+x);bufw.newLine();bufw.flush();}//记住,只要用到缓冲区,就要记得刷新。//bufw.flush();//其实关闭缓冲区,就是在关闭缓冲区中的流对象。bufw.close();}}


2、BufferedReader示例:

package tan;import java.io.BufferedReader;import java.io.FileReader;public class BufferReaderDemo {public static void main(String[] args) {FileReader fr = null;BufferedReader bf = null;try {fr = new FileReader("user.txt");bf = new BufferedReader(fr);// 只读出一行信息// String line=bf.readLine();System.out.println(line);// 读取所有的行while (true) {String line = bf.readLine();if (line == null) {break;}System.out.println(line);}} catch (Exception e) {e.printStackTrace();} finally {try {fr.close();bf.close();} catch (Exception e2) {System.out.println(e2);}}}}

3、通过缓冲区复制一个.java文件。

package tan;import java.io.*;public class CopyTest {public static void main(String[] args) {BufferedReader br=null;BufferedWriter bw=null;try {//先读取源文件br=new BufferedReader(new FileReader("C:/Users/Administrator/workspace1/20140727/src/tan/CopyTest.java"));//写入目的文件bw=new BufferedWriter(new FileWriter("to.txt"));String line=null;while((line=br.readLine())!=null){bw.write(line);bw.newLine();//换行bw.flush();//刷新缓存}} catch (Exception e) {e.toString();}finally{try {//关闭流if(br!=null) br.close();if(bw!=null) bw.close();} catch (Exception e2) {e2.printStackTrace();}}}}

4、ReadLine方法的原理:无论是读一行还是读取多个字符。其实都是在硬盘上一个个读取。所以最终使用的还是read方法一次读一个。

明白了BufferedReader类中特有方法readLine的原理后,可以自定义一个类中包含一个功能和readLine一致的方法。
来模拟一下BufferedReader


ReadLine()方法模拟示例:

package tan;//模拟readline原理import java.io.*;import javax.annotation.processing.Filer;class MyBufferedReader extends Reader{private Reader r;public MyBufferedReader(Reader r) {this.r=r;}//一次读一行数据的方法。public String MyReadLine() throws IOException{//定义一个临时容器。原BufferReader封装的是字符数组。//为了演示方便定义一个StringBuilder容器。因为最终还是要将数据变成字符串。StringBuilder sb=new StringBuilder();int ch=0;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 sb.toString();return null;}/*覆盖Reader类中的抽象方法。*/@Overridepublic void close() throws IOException {r.close();}@Overridepublic int read(char[] cbuf, int off, int len) throws IOException {return r.read(cbuf,off,len);}}public class MyBufferedReaderDemo  {public static void main(String[] args)throws IOException {FileReader fr=new FileReader("to.txt");MyBufferedReader mybuf=new MyBufferedReader(fr);String line=null;while((line=mybuf.MyReadLine())!=null){System.out.println(line);}mybuf.close();}}

5、LineNumberReader 跟踪行号的缓冲字符输入流(BufferedReader的已知直接子类)

package tan;import java.io.*;class LineNumberReaderDemo {public static void main(String[] args)throws IOException {FileReader fr = new FileReader("user.txt");LineNumberReader lnr = new LineNumberReader(fr);String line = null;//lnr.setLineNumber(100);//设置起始位置while((line=lnr.readLine())!=null){System.out.println(lnr.getLineNumber()+":"+line);}lnr.close();}}

6、模拟一个带行号的缓冲区对象。【继承4中的 MyBufferedReader类】

package tan;import java.io.*;class MyLineNumberReader extends MyBufferedReader{private int lineNumber;MyLineNumberReader(Reader r) {super(r);}public String myReadLine() throws IOException{lineNumber++;return super.MyReadLine();}public void setLineNumber(int lineNumber){this.lineNumber=lineNumber;}public int getLineNumber(){return lineNumber;}}public class MyLineNumberReaderDemo {public static void main(String[] args)throws IOException{FileReader fr=new FileReader("user.txt");MyLineNumberReader mylnr=new MyLineNumberReader(fr);String line=null;mylnr.setLineNumber(0);while((line=mylnr.myReadLine())!=null){System.out.println(mylnr.getLineNumber()+":"+line);}mylnr.close();}}


0 0
原创粉丝点击