上一节在操作文件时使用的文件字节流(FileInputStream,FileOutputStream),但不同的编码方式可能会导致文件编码生成的字节数相差很大,所以对于文件操作可以使用文件字符流。
UTF-8:中文字3个字节,英文1个字节,数字1个字节
GBK:中文2个字节,英文1个字节,数字1个字节。
UTF-16LE:每个字符都是两个字节
注意:文件字符流(FileReader,FileWriter)仅适合处理字符文件,也就是通常以一下的文件。
package IO_Study;
import java.io.*;
/**
* 文件字符输出流FileWriter
* 1.确定源
* 2.选择流
* 3.操作
* 4.释放系统资源
*/
public class IOstudy06 {
public static void main(String[] args) {
//1.确定源
File dest = new File("E:/(A)PostgraduateFlies/JavaLearning/
JavaProjects/TestingProjects/dest.txt");
//2.选择流
Writer writer = null;
try {
writer = new FileWriter(dest,false);//是否追加/覆盖写入的标志,这个标志是下一次run程序的时候起作用
//3.操作
// String str = "发达的范哈哈哈,hello/123";
// char[] datas = str.toCharArray();//把字符串转换为字符数组
// writer.write(datas, 0, datas.length);
// writer.write("人民战争的汪洋大海123,party");
// writer.flush();
writer.append("法比本科\n").append("fsbdkjbvvkj");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (null != writer) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
需要说明的是:
操作文件字符流的步骤与操作文件字节流相同,思路相通;
由继承体系可知,FileReader类是InputStreamReader的子类,InputStreamReader类是Reader的子类,FileReader拥有Reader和InputStreamReader的所有方法和属性,所以读写的方式与文件字节输入输出流相同。
在写入文件的时候,有三种方式:
writer = new FileWriter(dest,false);//是否追加/覆盖写入的标志 //3.操作,方法一 String str = "发达的范哈哈哈,hello/123"; char[] datas = str.toCharArray();//把字符串转换为字符数组 writer.write(datas, 0, datas.length); //方法二 writer.write("人民战争的汪洋大海123,party"); writer.flush(); //方法三 writer.append("法比本科\n").append("fsbdkjbvvkj"); writer.flush();
可以看到FileWriter类的爷爷类Writer的write方法如下:
可以直接写入一个字符、字符串数组或者字符串,所以以上的三种方法都可以写入。
有一个注意点就是:在选择流的时候Writer writer = new FileWriter(dest,false);,这里的true或者false代表使用这个文件字符写入流写入的时候是覆盖写入还是追加写入。
但是关于这个布尔标志我发现了一个问题,如下,我这里设置的不可追加,但是运行完两句writer之后文件里面面却是追加写入的这两个字符串,不知道为何?
writer = new FileWriter(dest,false); String str = "人民战争的汪洋大海123,party"; writer.write(str,0,5); writer.write("\n不对劲巴洛克"); writer.flush();
经测试发现:这里追加(append)标识是在下一次运行程序的时候起作用,并不是在运行过程中起作用。
这是一个使用文件字符输入输出流进行文本文件的拷贝的程序:
package IO_Study;
import java.io.*;
/**
* 使用文件字符输入流,文件字符输出流进行纯文本文件的拷贝
* <p>
* 1.确定源
* 2.选择流
* 3.操作
* 4.释放系统资源
*/
public class IOstudy07 {
public static void main(String[] args) {
//1.确定源
File src = new File("E:/(A)PostgraduateFlies/JavaLearning/JavaProjects/TestingProjects/src/IO_Study/abc.txt");
File dest = new File("E:/(A)PostgraduateFlies/JavaLearning/JavaProjects/TestingProjects/dest.txt");
//2.选择流
Reader reader = null;
Writer writer = null;
try {
//2.选择流
reader = new FileReader(src);
writer = new FileWriter(dest);
//3.操作
char[] flush = new char[1024];//每次读取1024个字符
int len = -1;
while ((len = reader.read(flush)) != -1) {
writer.write(flush, 0, len);
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//4. 释放系统资源
if (null != writer) {
/有可能文件字节流建立失败,所以要判断
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (null != reader) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}