IO流用来处理设备间的数据传输,分为字节流和字符流(融合了编码表,处理常见的文本数据)。
常用基本类之字符流类:Reader:Writer
1.FileWriter和FileReader
这两个类是字符流类的子类,可以实现文本的写入和读取,查阅API也可以看出,这两个类很简单。
写入:
FileWriter fw = new FileWriter("/Volumes/Function/G/demo.txt");//创建文本文件
fw.write("abc");//写入流中
fw.flush();//将数据刷新到文本中,如果不刷,则不会写入文本中
fw.close();//关闭之前会刷新一次内部缓冲,将数据刷到目的地中,flush刷新会继续使用。
其中,flush()和close()方法的区别在于,flush仅仅刷新了缓冲,并没有关闭流,在刷新后可以继续写入,而close则是在关闭之前刷新一次缓冲区,之后就不能再写入。
读取:
FileReader fr = new FileReader("/Volumes/Function/G/demo.txt");
// 一次读一个字符
int ch = 0;
while((ch = fr.read()) != -1){
System.out.println((char)ch);
}
//循环读取数据
char[] chr = new char[1024];
int number = 0;
while((number = fr.read(chr)) != -1){
System.out.println(number + "*******"+new String(chr,0,number));
}
fr.close();
复制文本:
(1)边读边复制,速度较慢
FileWriter fw = new FileWriter("/Volumes/Function/G/demo_copy.txt");//创建复制后的文本
FileReader fr = new FileReader("/Volumes/Function/G/demo.txt");//读取要复制的文本
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
fw.close();
fr.close();
(2)先读取,临时存储,然后写入
FileWriter fw = null;
FileReader fr = null;
try {
fw = new FileWriter("/Volumes/Function/G/demo_copy1.txt");
fr = new FileReader("/Volumes/Function/G/demo.txt");
char[] ch = new char[1024];
int len = 0;
while ((len = fr.read(ch)) != -1) {
fw.write(ch, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.BufferedWriter和BufferedReader
字符串的缓冲区,提高对数据的读写效率,需要结合流来使用,所以在创建缓冲区前必须有流对象。与FileWriter和FileReader类似。
写入:
FileWriter fw = new FileWriter("/Volumes/Function/G/demo_test.txt");
BufferedWriter bufw = new BufferedWriter(fw);//将流对象传递给BufferedWriter方法即可利用缓冲区函数方法进行读写
bufw.write("abcd");
bufw.newLine();
bufw.write("dajhd");
bufw.flush();
bufw.close();
读取:
FileReader fr = new FileReader("/Volumes/Function/G/demo_test.txt");
BufferedReader bufr = new BufferedReader(fr);
String s = "";
while((s = bufr.readLine()) != null){
System.out.println(s);
}
bufr.close();
复制:与FileWriter、FileReader类似。
3.LineNumberReader
这一子类新增了两个方法,getLineNumber()和setLineNumber(),对于读取和写入方法还是一样的。
FileReader fr = new FileReader("/Volumes/Function/G/demo_test.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String line = null;
while((line = lnr.readLine()) != null){
System.out.println(lnr.getLineNumber() + ":" + line);
}
lnr.close();
效果如下: