loading黑马程序员之IO字符流(2-1)

-------android培训 、java培训、期待与您交流! ----------

Java IO流根据分类方式不同有4个基类:Reader(字符输入流),Writer(字符输出流),inputSream(字节输入流),outputStream(字节输出流)。

 java.io.Reader、java.io.Writer与其子类等是处理字符流(Character Stream)的相关类。

简单地说,就是对流数据以一个字符(两个字节)的长度为单位来处理,并进行适当的字符编码转换处理,即Reader、Writer与其子类可以用于进行所谓纯文本文件的字符读/写


先来一个对字符流基本的输入输出操作。

package com.heima.io;

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

/**
 * 功能:复制文本文件
 */
public class ReadAndWriteTextFileDemo {

	public static void main(String[] args) {
		// 基于当前目录
		File sourceFile = new File("1.txt");
		File targetFile = new File("2.txt");
		FileReader fr = null;
		FileWriter fw = null;
		BufferedReader br = null;
		BufferedWriter bw = null;
		try {
			fr = new FileReader(sourceFile);
			// 创建一个文件,如果文件存在则覆盖,追加模式不覆盖
			// new RandomAccessFile("1.txt", "rdw").seek(100)也可实现追加
			fw = new FileWriter(targetFile);
			// 对流进行封装,实现缓冲。
			// 把读取的数据缓冲到一个临时空间,然后一起写,提高了效率
			br = new BufferedReader(fr);
			bw = new BufferedWriter(fw);
			String line = null;
			while ((line = br.readLine()) != null) {
				// 字符流要先转换成字节流,输出到缓冲区,文件实际上并没有进入目的地。
				// 字节流就不需要flush,直接写到目的地。
				bw.write(line);
				// BufferedWriter不会把换行写入文件,所以要手动换行
				bw.newLine();
				// 及时刷新缓冲区数据
				// 防止发生断电等意外导致缓存区数据没有刷新到目的地,但是耗资源
				bw.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 流应该一个一个的关,防止发生异常后,后面的流没有关闭
			// buffer的关闭实际上就是关闭了buffer封装的reader或writer流
			// 所以reader或writer流不用再关闭
			// 这也是可以用reader或writer作为匿名内部类的原因
			try {
				if (br != null)
					br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if (bw != null)
					bw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}


然后,简单写一个模拟BufferedReader的readLine()和close()方法的类,加深对buffer封装流的理解

package com.heima.io;

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

/**
 * 功能:简单模拟BufferedReader的readLine()和close()方法
 * 
 * 问题:myReadLine()方法如果遇到某一行没有数据,就不会往下读了。 这是个问题,小弟暂时不知道怎么做,如果你知道,请告诉我
 */
public class MyBufferedReaderDemo {

	public static void main(String[] args) {
		MyBufferedReader mbr = null;
		BufferedWriter bw = null;
		try {
			mbr = new MyBufferedReader(new FileReader("1.txt"));
			bw = new BufferedWriter(new FileWriter("2.txt"));
			String line = null;
			while ((line = mbr.myReadLine()) != null) {
				bw.write(line);
				bw.newLine();
				bw.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (mbr != null)
					mbr.myClose();
			} catch (Exception e) {
				e.printStackTrace();
			}
			try {
				if (bw != null)
					bw.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	/**
	 * 自定义缓存读取类
	 */
	static class MyBufferedReader {

		private Reader reader = null;

		public MyBufferedReader(Reader reader) {
			this.reader = reader;
		}

		public String myReadLine() throws IOException {
			// StringBuilder(线程不安全) 与Stringbuffer的区别:
			// 参考:http://blog.csdn.net/rmn190/article/details/1492013
			StringBuilder sb = new StringBuilder();
			int ch = 0;
			while ((ch = reader.read()) != -1) {
				// window的换行符是\r\n,linux是\n
				// 读到换行的第一个字符\r,不再写数据,继续读
				if (ch == '\r')
					continue;
				// 读到换行的第二个字符\n,不再读数据,返回已经读取的数据
				if (ch == '\n')
					break;
				// 读取字符
				else
					sb.append((char) ch);
			}
			if (sb.length() > 0)
				return sb.toString();
			else
				return null;
		}

		/**
		 * Buffered关闭的实际上就是流 所以,关闭了Buffere就不用再关闭流
		 */
		public void myClose() throws IOException {
			reader.close();
		}

	}

}

------- android培训  、 java培训 、期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值