------
黑马程序员——21,字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader
/*
字符流的缓冲区技术:
对于一些大文件,如果读取一个字符才写一个字符,读写操作过于频繁。
为了解决这个问题,引入了缓冲区技术。
缓冲区技术是在流的基础上(必须要先有流)增强了流对于数据的操作效率。
就如同在水龙头上拿水喝,原本是一滴一滴喝的,但是现在用了一个杯子装着来喝,更有效率。
*/
import java.io.*;
class Ioliou7
{
public static void main(String[] args)
{
FileWriter fw=null;
BufferedWriter bfw=null;
try
{
fw=new FileWriter("f:\\yuyuyu.txt");
bfw=new BufferedWriter(fw);
//把写入流对象传给缓冲区构造函数
bfw.write("假面骑士01号登场!");
//实际上把字符写入流的还是fw调用底层资源实现的
bfw.newLine();
//换行
bfw.write("假面骑士02号登场!");
bfw.flush();
//这里还是要刷新才把存在流的数据传倒文件里面
}
catch(IOException e)
{
throw new RuntimeException("写操作有误");
}
finally
{
try
{
if(bfw!=null)
{
bfw.close();
//关闭流,
/*
bfw.close();本质上关闭流的还是fw底层调用close()方法实现的,
所以就不用再写fw.close();了
*/
}
}
catch(IOException e)
{
throw new RuntimeException("bfw.close();出问题抛出异常了");
}
}
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
——————分割线——————
/*
字符流的读取缓冲区技术
BufferedReader
*/
import java.io.*;
class Ioliou8
{
publicstatic void main(String[] args)
{
FileReader fr=null;
BufferedReader bfr=null;
try
{
fr=new FileReader("e:\\JAVAwenjian\\Ioliou8.java");
bfr=new BufferedReader(fr);
String s=null;
while((s=bfr.readLine())!=null)
/*
readLine()一行一行的读取,不包含任何行终止符,如果没有数据读取就返回null,
但是不返回回车符,所以输出打印或者写入的时候要记得换行。
readLine读取数据本质上还是要调用read方法一个一个读取的
*/
{
soc(s);
}
}
catch(IOException e)
{
throw new RuntimeException("读操作出问题");
}
finally
{
try
{
if(bfr!=null)
bfr.close();
}
catch (IOException e)
{
throw new RuntimeException("读操作出问题");
}
}
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
————————分割线————
/*
字符流利用缓冲区进行复制操作文件
把e:\\JAVAwenjian\\Ioliou8.java复制到d盘中。
*/
import java.io.*;
class Ioliou9
{
public static void main(String[] args)
{
FileWriter fw=null;
FileReader fr=null;
BufferedWriter bfw=null;
BufferedReader bfr=null;
try
{
fw=new FileWriter("d:\\Ioliou8_copy.java");//建立字符流写入对象
fr=new FileReader("e:\\JAVAwenjian\\Ioliou8.java");//建立字符流读取对象
bfw=new BufferedWriter(fw);//建立字符流写入缓冲区
bfr=new BufferedReader(fr);//建立字符流读取缓冲区
String s=" ";
while((s=bfr.readLine())!=null)
{
bfw.write(s);
bfw.newLine();//换行
}
}
catch (IOException e)
{
throw new RuntimeException("复制操作出问题");
}
finally
{
try
{
if(bfw!=null)
bfw.close();
}
catch(IOException e)
{
throw new RuntimeException(" bfw.close();出问题");
}
try
{
if(bfr!=null)
bfr.close();
}
catch (IOException e2)
{
throw new RuntimeException("bfr.close();出问题");
}
}
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
————————分割线——————
/*
建立一个自己的BufferedReader
这种设计模式也被称之为装饰设计模式,
自定义一个类把已有的对象传进来,
然后针对已有的功能进行强化。
*/
import java.io.*;
class MyBufferedReader
{
private FileReader fr=null;
MyBufferedReader(FileReader fr)
{
this.fr=fr;
}
StringBuffer sb=new StringBuffer();
public String readLine()throws IOException
{
char ch=' ';
int i=0;
while((i=fr.read())!=-1)
{
if(i=='\r')
continue;
if(i=='\n')
return sb.toString();
ch=(char)i;
sb.append(ch);
}
if(sb!=null)
return sb.toString();
return null;
/*
sb.toString()返回的是容器内部的字符串,
写返回值的时候千万不要直接写return sb
sb是StringBuffer型的容器!
*/
}
public void close()throws IOException
{
fr.close();
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
class Ioliou10
{
public static void main(String[] args)
{
MyBufferedReader bfr =null ;
FileReader fr=null;
try
{
fr=new FileReader("f:\\yuyuyu.txt");
bfr=new MyBufferedReader(fr);
String s=bfr.readLine();
soc(s);
}
catch(IOException e)
{
throw new RuntimeException("操作异常");
}
finally
{
try
{
if(bfr!=null)
bfr.close();
}
catch (IOException e)
{
throw new RuntimeException("bfr.close();出问题了");
}
}
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
——————分割线————
/*
装饰类的介绍:(装饰设计模式)
通常自定义一个类,传进已有的对象,然后增加已有的功能。
装饰类和被装饰类都有着相同的功能,只不过前者功能更强。
所以,一般装饰类和被装饰类在同一个体系中,
而且装饰类记得要覆盖父类的抽象方法,
注意是否要抛出异常。
*/
import java.io.*;
class MyBufferedReader extends Reader
{
private FileReader fr=null;
MyBufferedReader(FileReader fr)
{
this.fr=fr;
}
StringBuffer sb=new StringBuffer();
public String readLine()throws IOException
{
char ch=' ';
int i=0;
while((i=fr.read())!=-1)
{
if(i=='\r')
continue;
if(i=='\n')
return sb.toString();
ch=(char)i;
sb.append(ch);
}
if(sb!=null)
return sb.toString();
return null;
}
public void close()throws IOException
{
fr.close();
}
public static void soc(Object obj)
{
System.out.println(obj);
}
//下面记得要覆盖Reader类中的抽象方法
public int read(char[] cbuf,int off,int len)throws IOException
{
return fr.read(cbuf,off,len);
}
}
class Ioliou11
{
public static void main(String[] args)
{
MyBufferedReader bfr =null ;
FileReader fr=null;
try
{
fr=new FileReader("f:\\yuyuyu.txt");
bfr=new MyBufferedReader(fr);
String s=bfr.readLine();
soc(s);
}
catch(IOException e)
{
throw new RuntimeException("操作异常");
}
finally
{
try
{
if(bfr!=null)
bfr.close();
}
catch (IOException e)
{
throw new RuntimeException("bfr.close();出问题了");
}
}
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
——————分割线——————
/*
LineNumberReader类的应用:
该类是BufferedReader类的子类
*/
import java.io.*;
class Ioliou12
{
public static void main(String[] args)
{
FileReader fr=null;
LineNumberReader lnr=null;
try
{
fr=new FileReader("Ioliou12.java");
//建立读取流对象
lnr= new LineNumberReader(fr);
String s=" ";
lnr.setLineNumber(123);
//设置行号从123的后一行开始
while((s=lnr.readLine())!=null)
{
soc(lnr.getLineNumber()+":"+s);
//getLineNumber方法用来获取行号
}
}
catch(IOException e)
{
throw new RuntimeException("读取操作出问题");
}
finally
{
try
{
if(inr!=null)
lnr.close();
}
catch(IOException e2)
{
throw new RuntimeException("lnr.close();出问题了");
}
}
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
编译运行结果如图1所示:
图1