java io 学习之三 字符流的缓冲区

来源:互联网 发布:巨灵数据 编辑:程序博客网 时间:2024/05/02 03:08


/**

字符流的缓冲区

缓冲区的出现,提高了对数据的读写效率

对应的类:

BufferedWriter

BufferedReader

缓冲区要结合流才可以使用

缓冲区是在流的基础上对流的功能进行增强

 

软件的优化可以分为:设计优化和性能优化

设计优化:对代码进行重构,让代码实现更强的可扩展性和灵活性,复用性。

提高性能最常用的的手段是:缓冲区  线程池

 

BufferedWriter

构造方法摘要 

BufferedWriter(Writer out) 

          创建一个使用默认大小输出缓冲区的缓冲字符输出流。 

BufferedWriter(Writer out, int sz) 

          创建一个使用给定大小输出缓冲区的新缓冲字符输出流。 

  方法摘要 

 void close() 

          关闭此流,但要先刷新它。 

 void flush() 

          刷新该流的缓冲。 

 void newLine() 

          写入一个行分隔符。 

 void write(char[] cbuf, int off, int len) 

          写入字符数组的某一部分。 

 void write(int c) 

          写入单个字符。 

 void write(String s, int off, int len) 

          写入字符串的某一部分 

 

 

 

BufferedReader

BufferedReader(Reader in) 

          创建一个使用默认大小输入缓冲区的缓冲字符输入流。 

BufferedReader(Reader in, int sz) 

          创建一个使用指定大小输入缓冲区的缓冲字符输入流。 

 

方法摘要 

 void close() 

          关闭该流并释放与之关联的所有资源。 

 void mark(int readAheadLimit) 

          标记流中的当前位置。 

 boolean markSupported() 

          判断此流是否支持 mark() 操作(它一定支持)。 

 int read() 

          读取单个字符。 

 int read(char[] cbuf, int off, int len) 

          将字符读入数组的某一部分。 

 String readLine() 

读取一个文本呢行。 行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 ('\n') 符。

 

 boolean ready() 

          判断此流是否已准备好被读取。 

 void reset() 

          将流重置到最新的标记。 

 long skip(long n) 

          跳过字符。 

缓冲区在创建时,必须要有缓冲的对象。必须要刷新缓冲区。

缓冲对象操作的是缓冲区的数据

 

*/

 

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

 

class BufferedDemo

{

public static void main(String[] args) throws IOException 

{

FileWriter fw = new FileWriter("buf.txt");

//为了提高效率,加入缓冲区

//创建一个字符流的缓冲区对象,并和指定要缓冲的流对象关联

BufferedWriter bw = new BufferedWriter(fw);

//使用缓冲区的方法,把数据写入缓冲区中

bw.write("sdfsdfhajkl;sdfjiokpl;askdjfuiojr8weur");

//换行,写入一个平台换行分隔符

bw.newLine();

bw.write("sdfsdfhajkl;sdfjiokpl;askdjfuiojr8weur");

//刷新缓冲区,将数据写入目的地

bw.flush();

//关闭流对象   关闭缓冲区时,会把被缓冲的对象也关闭掉。

//关闭缓冲区,其实就是关闭流对象。

bw.close();

//fw.close();

 

}

}

 

BufferedReader示例

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;

class BufferedDemo

{

public static void main(String[] args) throws IOException 

{

FileReader fr= new FileReader("buf.txt");

//为了提高效率,加入缓冲区

//创建一个字符流的缓冲区对象,并和指定要缓冲的流对象关联

BufferedReader br = new BufferedReader(fr);

//使用缓冲区的方法,把数据读到缓冲区中

///会自动读下一行,如果读到结尾,返回空

//每次第一个字符,读完一行以后,一次返回

String line = null;

while((line = br.readLine())!= null)

{

System.out.println(line);

}

//关闭流对象

br.close();

}

}


案例使用缓冲区进行文件读写

package cn.io.test;

 

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 BufferedDemo {

public static void main(String[] args) throws FileNotFoundException ,IOException{

//创建文件读取对象

FileReader fr = new FileReader("test.txt");

//创建文件读取缓冲对象

BufferedReader br = new BufferedReader(fr);

//创建文件写入对象

FileWriter fw = new FileWriter("test1.txt");

//创建文件写入缓冲区对象

BufferedWriter bw = new BufferedWriter(fw);

//读取和写入文件

String line = null;

while((line = br.readLine())!= null)

{

//读一行写一行

bw.write(line);

bw.newLine();

//每写一次,都需要刷新缓冲区

bw.flush();

}

//关闭流文件  在缓冲区关闭时,已经调用了流的关闭

bw.close();

br.close();

}

}

自定义读取缓冲区

package cn.io.test;

 

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

/**

 * 自定义的读写缓冲区:

 * 模拟一个BufferedReader

 * 明确是对那个对象进行缓冲

 * 需要重写缓冲区特有的方法

 * 缓冲区的特点 :封装数组,并对外提供更多的方法对数组进行访问

 * 即操作数组的指针(数组的角标)

 * 缓冲的原理:

 * 就是从源中获取一批数据封装在缓冲区中。

 * 再从缓冲区中不断的取出一个一个的数据,在此次取完后,再从源中

 * 继续取一批数据进入缓冲区,当源中的数据取完时,用-1作为标记。

 *@author ning

 */

public class MyBufferedReader {

private FileReader fr = null;

//定义计数器用于记录缓冲区的数据个数,当计数器为0时,就从源中继续获取数据到缓冲区中。

private int count =0;

//定义一个数组作为缓冲区

private char buf[] = new char[1024] ;

//定义一个指针用于操作数组中的元素,当操作到最后一个元素后,指针归零。

private int pos = 0;

public MyBufferedReader(FileReader fr) {

this.fr = fr;

}

public int myRead() throws IOException{

//从源中获取一批数据到缓冲区中,只有计数器为0,才需要从源中获取数据。

/*if(count == 0){

count = fr.read(buf);

//每抓取一次数据pos都要归零一次

pos = 0;

//必须判断count是否为-1.即读取是否完毕

if(count<0){

return -1;

}

return readChar();

}else if(count >0){

return readChar();

}*/

if(count == 0){

count = fr.read(buf);

//每抓取一次数据pos都要归零一次

pos = 0;

}if(count<0){

return -1;

}

return readChar();

}

//在整型方法中可以返回一个字符

private int readChar() {

char ch = buf[pos];

pos++;

count--;

return ch;

}

public String myReadLine() throws IOException{

StringBuilder sb = new StringBuilder();

int ch = 0;

while((ch=myRead())!= -1){

//从缓冲区读取字符,读到的字符存到行数据的缓冲区中

if(ch == '\r'){

continue;

}

if(ch == '\n'){

return  sb.toString();

}

sb.append(ch);

}

//放置没有换行符时丢失数据

if(sb.length() != 0){

return sb.toString();

}

return null;

}

public void myClose() throws IOException{

if(fr!=null){

fr.close();

}

}

}




0 0
原创粉丝点击