您的位置:首页 > 职场人生

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

2013-12-29 10:27 246 查看
-------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培训、期待与您交流!
----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息