-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
IO流(BufferedWriter)
字符流的缓冲区:
对应类
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用。
在流的基础上对流的功能进行了增强。
类BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
缓冲区的出现是为了提高流的操作效率而出现的。
所以在创建缓冲区之前,必须要先有流对象。
特殊方法:
跨平台换行符。
void newLine() 写入一个行分隔符。
BufferedReader:
String readLine()
读取一个文本行。
返回:包含该行内容的字符串,不包含任何行终止符,如果已达到流末尾,则返回null。
/*
字符读取流缓冲区:
该缓冲区提供了一个一次读一行的方法readLine,方便与对文本数据的获取。
当返回null时,表示读到文件末尾。
*/
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException
{
//创建一个读取流对象和文件相关联。
FileReader fr = new FileReader(".\\src\\BufferedReaderDemo.java");
//为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
BufferedReader bufr = new BufferedReader(fr);
String line = null;
while((line=bufr.readLine())!=null)
System.out.println(line);
bufr.close();
}
}
练习:
通过缓冲区复制一个.java文件。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyTextByBuf
{
public static void main(String[] args)
{
FileReader fr =null;
BufferedReader br=null;
FileWriter fw = null;
BufferedWriter bw=null;
try {
fr = new FileReader(".\\src\\CopyTextByBuf.java");
br = new BufferedReader(fr);
fw = new FileWriter("CopyTextByBuf.java");
bw = new BufferedWriter(fw);
String frstr ;
while((frstr=br.readLine())!=null)
{
bw.write(frstr+System.lineSeparator());//bw.newLine();
bw.flush();
System.out.print(frstr+System.lineSeparator());
}
} catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
try {
if(br!=null)
br.close();
} catch (IOException e) {
throw new RuntimeException("读关闭失败");
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
throw new RuntimeException("写关闭失败");
}
}
}
}
//readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。
//readLine方法的原理
//无论是读一行,获取多个字符。其最终都是在硬盘上一个一个读取。
//所以最终使用的还是read方法,一次读一个的方法。
//明白了BufferedReader类中特有方法readLine的原理后,
//可以自定义一个类中包含一个功能和readLine一致的方法。
//<strong>来模拟一下BufferedReader。</strong>
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
例子:
class Person
{
public void chifan()
{
System.out.println("吃饭");
}
}
//增强吃饭功能
class SuperPerson
{
private Person p;
SuperPerson(Person p)
{
this.p=p;
}
public void superChifan()
{
System.out.println("开胃酒");
p.chifan();
}
}
public class PersonDemo {
public static void main(String[] args)
{
Person p = new Person();
SuperPerson sp = new SuperPerson(p);
sp.superChifan();
}
}
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
装饰和继承的区别:
MyReader//专门用于读取数据的对象。
|——MyTextReader
|——MyBufferTextReader
|——MyMediaReader
|——MyBufferMediaReader
|——MyDataReader
|——MyBufferDataReader
利用装饰设计模式进行优化:
class MyBufferReader extends Myreader
{
private MyReader mr;
MyBufferReader(MyReader mr)
{
this.mr = mr;
}
}
优化后的体系:
MyReader//专门用于读取数据的对象。
|——MyTextReader
|——MyMediaReader
|——MyDataReader
|——MyBufferDataReader
装饰模式比继承要灵活。避免了继承体系的臃肿。
而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。
所以装饰类和被装饰类通常是都属于一个体系中。
练习:将myBufferedReader变成Reader的子类。
BufferReader的子类:
LineNumberReader 跟踪行号的缓冲字符输出流。 也是一个包装类。
其中含有两个方法:
setLineNumber和getLineNumber。设置行号和获取行号。
//练习:模拟一个带行号的缓冲区对象。
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
class MyLineNumberReader extends BufferedReader
{
private int n ;
public MyLineNumberReader(Reader in)
{
super(in);
n=0;
}
public int getLine()
{
return n;
}
public void setLine(int n)
{
this.n = n;
}
public String readLine() throws IOException
{
n++;
return super.readLine();
}
}
public class MyLineNumberReaderDemo {
public static void main(String[] args) throws IOException
{
MyLineNumberReader mr = null;
mr= new MyLineNumberReader(new FileReader(".\\src\\MyLineNumberReaderDemo.java"));
String str = null;
while((str = mr.readLine())!=null)
{
System.out.print(mr.getLine()+str+System.lineSeparator());
}
mr.close();
}
}
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------