1. 字符流
由于字节流操作中文不是特别方便,因此Java提供了转换流。
字符流=字节流+编码表。
字符流的抽象基类:Reader、Writer
Reader的一个子类:FileReader
2. 转换流
转换流可以将字节流转换成字符流。
字符输出流:OutputStreamWriter
构造函数如下:
public OutputStreamWriter(OutputStream out)
public OutputStreamWriter(OutputStream out, String charsetName) // 指定编码表
字符输入流:InputStreamReader
构造函数如下:
public InputStreamReader(InputStream in)
public InputStreamReader(InputStream in, String charsetName) // 指定编码表
OutputStreamWriter写操作
public void write(int c)
public void write(char[] cbuf)
public void write(char[] cbuf,int off,int len)
public void write(String str)
public void write(String str,int off,int len)
InputStreamReader读操作
public int read()
public int read(char[] cbuf)
字符流的其他方法:
close() // 关闭字符流对象
flush() // 清空缓冲区,将缓冲区中的内容加载到内存中去
如:读取 " E:\词频分析\text.txt" 文件,再把它写入到 “C:\Users\copy.txt” 中去。
// 一次读取一个字符数组
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class FileDemo {
public static void main(String[] args) throws IOException{
// 源文件 "E:\\词频分析\\text.txt"
// 目标文件 "C:\\Users\\copy.txt"
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\词频分析\\text.txt"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\Users\\copy.txt"));
char[] cbuf = new char[1024];
int len = 0;
while((len = isr.read(cbuf)) != -1){
osw.write(cbuf, 0, len);
osw.flush();
}
isr.close();
osw.close();
}
}
3. 转换流的简化写法
转换流为了简便写法,提供了相应的子类:
- FileWriter
- FileReader
构造函数:
public FileWriter(File fileName)
public FileWriter(String fileName)
public FileWriter(String fileName, boolean append) // 是否以追加的形式写入
public FileReader(File fileName)
public FileReader(String fileName)
简单看下FileWriter(String fileName)的源代码,了解为什么这是转换流的简化写法
// FileWriter是OutputStreamWriter的子类
// 该构造函数是将fileName作为父类OutputStreamWriter构造函数的构造参数
public FileWriter(String fileName) throws IOException{
super(new FileOutputStream(fileName));
}
如:读取 " E:\词频分析\text.txt" 文件,再把它写入到 “C:\Users\copy.txt” 中去。
// 一次读取一个字符数组
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException{
// 源文件 "E:\\词频分析\\text.txt"
// 目标文件 "C:\\Users\\copy.txt"
FileReader fr = new FileReader("E:\\词频分析\\text.txt");
FileWriter fw = new FileWriter("C:\\Users\\copy.txt");
char[] cbuf = new char[1024];
int len = 0;
while((len = fr.read(cbuf)) != -1){
fw.write(cbuf);
fw.flush();
}
fr.close();
fw.close();
}
}
4. 字符缓冲流
- BufferedWriter
- BufferedReader
基本构造函数
public BufferedWriter(Writer out)
public BufferedReader(Reader in)
特殊功能
// 对BufferedWriter,提供了newLine()方法,提供换行功能
void newLine();
// 对BufferedReader,提供了readline()方法,提供读取行功能
String readline()
还是那个例子,读取 " E:\词频分析\text.txt" 文件,再把它写入到 “C:\Users\copy.txt” 中去。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException{
// 源文件 "E:\\词频分析\\text.txt"
// 目标文件 "C:\\Users\\copy.txt"
BufferedReader br = new BufferedReader(new FileReader("E:\\词频分析\\text.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter( "C:\\Users\\copy.txt"));
String str = null;
while((str = br.readLine()) != null){
bw.write(str);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}
Tips:
方便记忆,构造函数中能接受append参数的两个类都以File开头,FileOutputStream和FileWriter
欢迎转载,表明出处。