缓冲区
为了提高流的读写操作效率而出现的所以在创建缓冲区之前,必须要现有流对象。
该缓冲区中,提供了一个快平台的换行符。
BufferedWriter
BufferedReader
字符写入缓冲区:
BufferedWriter
newLine()换行符。java中通用。
bufw.flush();刷新!
bufw.close();关闭缓冲区,就是关闭缓冲区中的流对象
不再需要单独关闭字符流!!!!
BufferedReader
bufr.readLine(); 读取整行。
该缓冲区,提供了一个一次读一行的方法readLine();放便于对文本数据的获取,
当返回null时,表示读到文件的末尾。
readLine()方法返回的时候,
只返回回车符之前的数据内容,并不返回回车符。
import java.io.*;
class Test
{
public static void main(String[] args) throws IOException
{
//创建一个字符写入流对象
FileWriter fw = new FileWriter("hello.java");
//为了提高自负写入流效率,加入类缓冲技术,
//只要将要被提高效率的流对象传递给缓冲区的构造函数即可。
BufferedWriter bufw = new BufferedWriter(fw);
bufw.write("abcdefg");
//换行符newLine();
bufw.newLine();
//记住,只要用到缓冲区,就要记着刷新
bufw.flush();
//关闭缓冲区,就是关闭缓冲区的流对象。
bufw.close();
fw.close();
//创建一个都去流对象和文件相关联。
FileReader fr = new FileReader("2.java");
//为了提高效率,加入缓冲技术,将字符读取流对象作为参数传递给缓冲对象的构造函数。
BufferedReader bufr2 = new BufferedReader(fr);
String line = null;
while ((line=bufr2.readLine())!=null)
{
sop(line);
}
bufr2.close();
}
public static void sop( Object obj)
{
System.out.println(obj);
}
}
通过缓冲区复制一个.java文件
/*
通过缓冲区复制一个.java文件
*/
import java.io.*;
class Test
{
public static void main(String[] args)
{
BufferedReader bufr = null;
BufferedWriter bufw = null;
try
{
bufr=new BufferedReader(new FileReader("2.java"));
bufw=new BufferedWriter(new FileWriter("hello.java"));
String line = null;
while((line = bufr.readLine())!=null);
{
bufw.write(line);
bufw.newLine();
bufw.flush();
}
}
catch (IOException e)
{
throw new RuntimeException ("读写失败");
}
finally
{
try
{
if (bufr!=null)
bufr.close();
}
catch (IOException e)
{
throw new RuntimeException("出现错误");
}
try
{
if (bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw new RuntimeException("出现错误");
}
}
}
public static void sop( Object obj)
{System.out.println(obj);}
}
readLine 方法原理
无论是都一行,获取读取多个字符。其实最终都是在硬盘上一个一个的读取,
所以最终使用的还是read放发一次读一个的方法。
模拟缓冲区
/*
明白了BufferedReader类中特有方法readLine的原理后
可以自定义一个类中包含一个功能和readLine一直的方法。
来模拟BufferReader。
*/
import java.io.*;
class Test
{
public static void main(String[] args) throws IOException
{
FileReader fr=new FileReader("1.java");
MyBufferedReader mybuf = new MyBufferedReader(fr);
String line=null;
while ((line=mybuf.myReadLine())!=null)
{
sop(line);
}
mybuf.myclose();
}
public static void sop( Object obj)
{
System.out.println(obj);
}
}
class MyBufferedReader
{
private FileReader r;
MyBufferedReader(FileReader 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;
}
public void myclose() throws IOException
{
r.close();
}
}
LineNumberReader
setLineNumber(int);默认从0开始。
getLineNumber();
import java.io.*;
class Test
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("1.java");
LineNumberReader lnr = new LineNumberReader(fr);
String line =null;
lnr.setLineNumber(1000);//行号初始化值
while ((line = lnr.readLine())!=null)
{
sop(lnr.getLineNumber()+"::"+line);//显示行号
}
lnr.close();
}
public static void sop( Object obj)
{
System.out.println(obj);
}
}
模拟行号装饰
import java.io.*;
class Test
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("1.java");
MyLineNumberReader Mylnr = new MyLineNumberReader(fr);
String line = null;
Mylnr.setLineNumber(100);
while((line=Mylnr.myReadLine())!=null)
{
sop(Mylnr.getLineNumber()+"::"+line);
}
Mylnr.myclose();
}
public static void sop( Object obj)
{
System.out.println(obj);
}
}
class MyLineNumberReader
{
private Reader r;
private int lineNumber;
MyLineNumberReader(Reader r)
{
this.r = r;
}
public String myReadLine() throws IOException
{
lineNumber++;
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;
}
public void setLineNumber(int lineNumber)
{
this.lineNumber = lineNumber;
}
public int getLineNumber()
{
return lineNumber;
}
public void myclose() throws IOException
{
r.close();
}
}