黑马程序员--IO(2)

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

字符流缓冲区:

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

2.对应类:

     BufferedReader

     BufferedWrite

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

4.在流的基础上对流的功能进行了加强


字符流写缓冲区:

package com.mth.BufferedWriter;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 
 * @ClassName: BufferedWriterTest
 * @Description: 缓冲区的出现是为了提高留的操作效率而出现的 
 * 				  所以在创建缓冲区之前,必须要先有流对象
 * 				 该缓冲区中提供了一个跨平台的换行符newLine();
 * @author mth 75100313@qq.com
 * @date 2014-2-17 下午10:00:20
 * 
 */
public class BufferedWriterTest {

	public static void main(String[] args) throws IOException {
		// 创建一个流对象
		FileWriter fileWriter = new FileWriter("buf.txt");

		// 为了提高字符写入流的效率加入了缓冲技术
		// 缓冲区原理:对象里面封装了数组
		// 只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可
		BufferedWriter bf = new BufferedWriter(fileWriter);

		
		for(int i=0;i<5;i++){
			
			bf.write("abc...."+i);
			
			//在window和linux里面都是换行
			bf.newLine();
			
			// 记住只要用到缓冲区 就要记得刷新
			bf.flush();
		}
		
		//关闭缓冲区  其实就是关闭他所提高效率的流对象,这里是fileWriter
		bf.close();

	}

}

字符流读缓冲区:

package com.mth.BufferedReader;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * 
 * @ClassName: BufferedReaderTest
 * @Description: 字符流缓冲区读  提供了一次独一行的方法readLine()方便与对文本数据的获取
 * 				 当返回空是表示读到文件末尾
 * @author mth 75100313@qq.com
 * @date 2014-2-17 下午10:15:33
 * 
 */
public class BufferedReaderTest {

	public static void main(String[] args) throws IOException {
		// 创建一个读取刘对象和文件相关联
		FileReader fileReader = new FileReader("buf.txt");

		// 为了提高效率加入缓冲技术 将字符读取流对象作为参数传递给缓冲对象的构造函数
		BufferedReader br = new BufferedReader(fileReader);
		
		//一行一行的读取
		String line = null;
		while ((line = br.readLine()) != null) {
			System.out.println(line);
		}
		
		//关闭缓冲区
		br.close();
	}

}


缓冲区实现.java文件的拷贝:

package com.mth.copy;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 
 * @ClassName: CopyJavaFile
 * @Description: 通过缓冲区复制一个.java文件
 * 				 readLine()方法返回的时候只返回回车符之前的数据内容
 * 				  并不返回回车符。
 * @author mth 75100313@qq.com
 * @date 2014-2-17 下午10:24:59
 * 
 */
public class CopyJavaFile {

	public static void main(String[] args) {
		//创建读取流
		BufferedReader bReader = null;
		//创建写入流
		BufferedWriter bWriter = null;

		try {
			bReader = new BufferedReader(new FileReader("Test1.java"));
			bWriter = new BufferedWriter(new FileWriter("Test1_copy.java"));

			String lineString = null;

			while ((lineString = bReader.readLine()) != null) {

				bWriter.write(lineString);
				bWriter.newLine();
				bWriter.flush();

			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 关缓冲区
			if (bReader != null) {
				try {
					bReader.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			if (bWriter != null) {

				try {
					bWriter.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		}

	}

}

readLine方法的原理:

无论是读一行,获取读取多个字符。其实最终还是在硬盘上面一个一个读取。所以最终使用的还是read方法一次读一个的方法。

自己实现readLine();

package com.mth.MyBufferedReader;

import java.io.FileReader;

/**
 * 
 * @ClassName: MyBufferedReader
 * @Description: 明白了BufferedReader类中特有方法readLine()的远离后
 *               可以自定义一个类中包含一个功能和readLine一致的方法 来模拟一下BufferedReader
 * @author mth 75100313@qq.com
 * @date 2014-2-17 下午10:57:42
 * 
 */
public class MyBufferedReader {

	private FileReader fr;

	// 初始化的时候就把流放进来
	public MyBufferedReader(FileReader fr) {
		super();
		this.fr = fr;
	}

	public String myReadLine() throws Exception {
		// 定义一个临时容器,把BufferReader封装的是字符数组
		// 为了演示方便。定一个StringBuilder容器
		StringBuilder sb = new StringBuilder();
		int ch = 0;
		while ((ch = fr.read()) != -1) {
			// 遇到回车符\r和\n的时候不放入数组并且在遇到\n的时候返回这一行数据

			if (ch == '\r')
				continue;
			if (ch == '\n')
				return sb.toString();
			sb.append((char) ch);

		}
		// 当最后以后没有回车符的时候 也要把数据返回
		if (sb.length() != 0) {
			return sb.toString();
		}
		return null;
	}

	// 关闭缓冲区的方法
	public void myClose() throws Exception {
		fr.close();
	}

}
测试类:

package com.mth.MyBufferedReader;

import java.io.FileReader;

public class MyBufferedReaderTest {

	public static void main(String[] args) throws Exception {

		MyBufferedReader mybuff = new MyBufferedReader(new FileReader(
				"buf.txt"));
		String line = null;
		while ((line = mybuff.myReadLine()) != null) {
			System.out.println(line);
		}
		mybuff.myClose();
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值