黑马程序员技术交流社区
标题:
IO流--字符流缓冲区
[打印本页]
作者:
洛奇亚
时间:
2015-9-18 23:08
标题:
IO流--字符流缓冲区
字符流缓冲区
1、缓冲区的出现提高了对数据的读取效率。
缓冲区原理:
其实就是从源中获取一批数据装进缓冲区中。
从缓冲区中不断的取出一个一个数据。
在此次取完后,从源中继续取一批数据进缓冲区。
当源中的数据取光后,用-1作为结束标志。
2、对应类:
BufferedWriter
BufferedReader
3、缓冲区要结合流才可以使用。
4、输出——字符流缓冲区
package com.buffered;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr= new FileReader("buf.txt");
//输出——字符流缓冲区
BufferedReader bufr=new BufferedReader(fr);
String line =null;
while((line=bufr.readLine())!=null){
System.out.println(line);
}
bufr.close();
}
/**
* @throws FileNotFoundException
* @throws IOException
*/
public static void Demo() throws FileNotFoundException, IOException {
FileReader fr=new FileReader("buf.txt");
char[] arr=new char[1024];
fr.read();
int len=0;
while((len=fr.read(arr))!=-1){
System.out.println(new String (arr,0,len));
}
fr.close();
}
}
5、字符写入流的缓冲区
package com.buffered;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterDemo {
private static final String BUFFER_SIZE = System.getProperty("line.separator");
public static void main(String[] args) throws IOException {
FileWriter fw= new FileWriter("buf.txt");
//为了提高写入的效率。使用了字符流的缓冲区。
//创建了一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联。
BufferedWriter bufw =new BufferedWriter(fw);
//使用缓冲区的写入方法将数据先写入到缓冲区中。
// bufw.write("sfdsvsa"+BUFFER_SIZE+"nhasfsdvf");
bufw.write("sadsfdbgn");
bufw.newLine();//换行
bufw.write("sadfb");
for(int x=1;x<=4;x++){
bufw.write("abcdef"+x);
bufw.newLine();
bufw.flush();
}
//使用缓冲区的刷方法将数据刷到目的地中。
bufw.flush();
//关闭缓冲区。其实关闭的就是被缓冲的流对象。
bufw.close();
}
}
6、使用缓冲区,提高读取效率
package com.buffered;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyTextBufferTest {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("buf.txt");
BufferedReader bufr=new BufferedReader(fr);
FileWriter fw =new FileWriter("buf_copy.txt");
BufferedWriter bufw =new BufferedWriter(fw);
//行读的方式
String line =null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufw.close();
bufr.close();
}
}
7、装饰设计模式:
对一组对象的功能进行增强时,就可以使用该模式进行问题的解决。
装饰和继承都能实现一样的特点:进行功能的扩展增强;
区别是:装饰比继承灵活。
(1) 首先有一个继承体系;
Writer
|--TextWriter:用于操作文本
|--MediaWriter:用于操作媒体
(2) 想要对操作的动作进行效率的提高;
按照面向对象,可以通过继承对具体的进行功能的扩展。
装饰: 效率提高需要加入缓冲技术。
Writer
|--TextWriter:用于操作文本
|--BufferTextWriter:加入了缓冲区技术的操作文本的对象。
|--MediaWriter:用于操作媒体
|--BufferMediaWriter:加入了缓冲区技术的操作媒体的对象。
特点:装饰类和被装饰类都必须所属同一个接口或者父类。
装饰思想——装饰器设计模式
package cn.itcast.p5.wrapper;
public class PersonDemo {
public static void main(String[] args) {
Person p= new Person();
//p.chifan();
NewPerson p1=new NewPerson(p);
p1.chifan();
}
}
class Person{
void chifan(){
System.out.println("吃饭");
}
}
//装饰思想——装饰器设计模式。
//这个类的出现是为了增强person而出现的。
class NewPerson{
private Person p;
NewPerson(Person p){
this.p=p;
}
public void chifan(){
System.out.println("开胃酒");
p.chifan();
System.out.println("甜点");
}
}
8、lineNumber:读行号
package cn.itcast.p6.io.linenumber;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
/*
* lineNumber:读行号
*/
public class LineNumberReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("buf.txt");
LineNumberReader lnr=new LineNumberReader(fr);
String line =null;
lnr.setLineNumber(2);//从第几行开始
while((line=lnr.readLine())!=null){
System.out.println(lnr.getLineNumber()+":"+line);
}
lnr.close();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2