Writer用于写出去到文件中,Reader用于把外面的文件读进控制台
Writer和Reader有很多子类,但是子类大多都是直接运用父类Writer和Reader的方法,而且Writer和Reader方法不多,且有共性,故只要搞懂Writer和Reader的方法即可。Writer和Reader都是抽象类,所以想输入输出只能用他们的子类。
字节流不能直接操作Unicode字符,所以java提供了字符流,汉字在文件中占用2个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象,在Unicode字符中,一个汉字被看作一个字符。
所有字符输入流类都是Reader(输入流)抽象类的子类,而所有字符输出流都是Writer(输出流)抽象类的子类。
Reader常用方法
读取方法
int read() 用于从流中读出一个字符,并将它返回
int read(char buffer[]):将从流中读出的字符放到字符数组buffer中,返回读出的字符数
int read(char buffer[],int offset,int length):将读出的字符放到字符数组的指定offset开始的空间,每次最多读出length个字符其他方法:
void close():关闭Reader流
skip(long n):跳过指定的n个字符
boolean ready():判断流是否已经准备好被读取
void mark(int readAheadLimit)
void reset()
Reader例子
Reader fr = new FileReader("C:/mydata.txt");
BufferedReader br = new BufferedReader(fr);
String record = null;
int count = 0;
while ((record = br.readLine()) != null) {
count++;
System.out.printf(“%d:%s“,count,record);
}
Reader类
低级Reader类:
CharArrayReader
StringReader
PipedReader
FileReader
高级Reader类
BufferedReader
InputStreamReader
LineNumberReader
Writer工作原理
将写入的数据先存储到缓冲区,随着刷新而将缓冲区中的数据输入到文件中,刷新后缓冲区清空,这就是缓冲技术。因而有了BufferWriter,对BufferWriter操作实际是对与BufferedWriter关联的FileWriter类操作,所以对BufferedWriter进行flush和close实际上是对FileWriter进行flush和close。
Reader读进来只能一个一个字符去读,所以这里缓冲技术显得格外重要。
复制的原理:将文本中的数据缓存到Reader流中,再新建个文件,用Writer释放出去。
Writer常用方法
写入方法:
void write(int c):将参数c的低16位组成字符写入到流中。
void write(char[] buffer):将字符数组buffer中的字符写入到流中。
void write(char[] buffer, int offset, int length):将字符数组buffer中从offset开始的length个字符写入到流中。
void write(String string):将string字符串写入到流中。
void write(String string, int offset, int length):将字符string中从offset开始的length个字符写入到流中。
其他方法:
void close():和OutputStream的close方法类似。
void flush():和OutputStream的flush方法类似。
Writer例子
try {
//字符文件输出流
Writer fw = new FileWriter(“c:/mydata.txt");
//打印流
PrintWriter out = new PrintWriter(fw); out.print("面朝大海,春暖花开!");
out.printf(“%d * %d = %d“, 2, 3, 2*3); out.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
从键盘输入数据,保存到文件中
//InputStreamReader为字节转换为字符输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new FileWriter(“d:\\abc.txt”));
String line = null;
while((line = reader.readLine()) != null){
if(“quit”.equals(line.toLowerCase())){
break;
}
pw.println(line);
}
pw.close();
Writer相关类
低级Writer类:
CharArrayWriter
StringWriter
PipedWriter
FileWriter
高级Writer类:
BufferedWriter
OutputStreamWriter
PrintWriter
用法示例:
//writer的用法
public class IOWriter {
/**
* @param IO流中的writer
* 向demo.txt文本中写入东西
* 如果是FileWriter fileWriter=new FileWriter("D:\\demo.txt",true);则是在之前的基础上续写
* 如果没有true,则是覆盖之前写的所以内容
*/
public static void main(String[] args) {
try {
FileWriter fileWriter=new FileWriter("D:\\demo.txt");
fileWriter.write("abc");
fileWriter.write("defg");
fileWriter.flush();//flush刷新后,流可以继续使用
fileWriter.close();//close刷新后,流关闭
} catch (IOException e) {
e.printStackTrace();
}
}
}
//reader的用法
public class IOReader {
/**
* @param IO流中的Reader
* 把demo.txt中的字符流都读出来
*/
public static void main(String[] args) {
try {
FileReader fileReader=new FileReader("D:\\demo.txt");
char[] buffer=new char[1024];
int len=0;
while((len=fileReader.read(buffer))!=-1) {
System.out.println(new String(buffer, 0, len));
}
//第一种方法:
/*
while(true) {
int a=fileReader.read();
if(a==-1) {
break;
}
System.out.print((char)a+"");
}*/
//第二种方法:
/*int a=0;
while ((a=fileReader.read())!=-1) {
System.out.print((char)a+"\t");
}*/
//第三种方法:
/*
* 读取文件的方法(经典)
*/
/*char[] buf=new char[1024];
int len=0;
while((len=fileReader.read(buf))!=-1) {
String bufferString=new String(buf, 0, len);
System.out.println(bufferString);
}*/
} catch (Exception e) {
e.printStackTrace();
}
}
}
参考博客:
http://blog.csdn.net/noble510520/article/details/50083555