---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
缓冲区的出现提供了数据的都写效率
对应类:BufferedReader、BufferedWriter缓冲区的出现是为了流的操作效率而出现的,
所以在创建缓冲区之前,必须要现有流对象
示例:
1.创建一个字符写入流对象
FileWriter fw = new FileWriter("buf.txt");
2.为了提高字符写入流的效率,加入了缓冲技术,
只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可
BufferedWriter bufw = new BufferedWriter(fw);
bufw.write("abc");
3.只要用到缓冲区,就要记得刷新
bufw.flush();
4.关闭缓冲区,其实就是在关闭缓冲区中的流对象(缓冲区底层调用的对象其实
还是FileWriter流对象,因为是文件直接跟它有关系)
bufw.close();
缓冲区中跨平台换行方法:bufw.newLine();
BufferedReader
特色:可以按行读取字符,方法String readLine();
1.创建一个读取流对象和文件相关联
FileReader fr = new FileReader("demo.txt");
2.为了提高效率,加入缓冲技术,将字符读取流对象作为参数传递给缓冲对象的构造函数
BufferedReader bufr = new BufferedReader(fr);
3.按行读取字符,readLine()返回的是回车符之前的字符,不包含换行或回车符
String s1 = bufr.readLine(); //达到末尾,没有字符则返回null,read()则是-1
关闭缓冲区
bufr.close();
readLine()原理:
无论是读一行,还是读取多个字符,其实最终都是在硬盘上一个一个字符的读取,所以
使用的还是read方法一次读取一个字符的方法
readLine()原理代码实现:
import java.io.FileReader;
import java.io.IOException;
/*
* BufferedReader读取流对象缓冲区中readLine()的原理实现
* readLine()底层用的其实还是read,而关闭缓冲区底层用的其实是关闭流对象
* readLine(),将换行符和回车符以外的字符返回到缓冲区,满一行则返回本行字符
* 如果判断满一行:
* windows中换行:\r\n
* Linux中换行:\n
* 为了实现跨平台,若碰到\r的时候,继续读取下一个字符,若\n则返回字符串
*/
public class ReadLineMethodPrinciple {
public static void main(String[] args)
{
// TODO Auto-generated method stub
MyBufferedReader mbuf = null;
try
{
mbuf = new MyBufferedReader(new FileReader("DateTest.java"));
String line = "";
while((line=mbuf.myReadLine())!=null)
{
sop(line);
}
}
catch(IOException e)
{
throw new RuntimeException("文件读取失败");
}
finally
{
try
{
if(mbuf!=null)
mbuf.myClose();
}
catch (IOException e)
{
throw new RuntimeException("文件关闭失败");
}
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class MyBufferedReader
{
private FileReader r = null;
MyBufferedReader(FileReader r)
{
this.r = r;
}
public String myReadLine() throws IOException
{
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=r.read())!=-1)
{
if((char)ch=='\r')
continue;
if((char)ch=='\n') //遇到\n返回字符串
return sb.toString();
sb.append((char)ch); //将字符存入字符串缓冲区
}
if(sb.length()!=0) //这个判断是为了最后一行没有换行标记的情况下返回本行字符
return sb.toString();
return null;
}
public void myClose() throws IOException
{
r.close();
}
}
LineNumberReader中的getLineNumber()实现原理:
import java.io.FileReader;
import java.io.IOException;
/*
* LineNumberReader添加行号原理
*/
public class LineNumberReaderPrinciple
{
public static void main(String[] args) {
// TODO Auto-generated method stub
MyLineNumberReader mbnr = null;
try
{
mbnr = new MyLineNumberReader(new FileReader("DateTest.java"));
String line = "";
//mbnr.setNumber(129);
while((line=mbnr.lineNumReader())!=null)
{
System.out.println(mbnr.getNumber()+"~~"+line);
}
}
catch(IOException e)
{
throw new RuntimeException("文件打开失败");
}
finally
{
try
{
if(mbnr!=null)
mbnr.myClose();
}
catch(IOException e)
{
throw new RuntimeException("文件关闭失败");
}
}
}
}
/*
* MyBufferedReader是ReadLine的原理实现,
* 这里只要在readLine方法上增加计数器即可
* 所以继承MyBufferedReader
*/
class MyLineNumberReader extends MyBufferedReader
{
private int number;
MyLineNumberReader(FileReader r)
{
super(r);
}
public String lineNumReader() throws IOException
{
number++;
return super.myReadLine();
}
public void setNumber(int number)
{
this.number = number;
}
public int getNumber()
{
return number;
}
}
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net