FileReader(文件字符输入流)
- 作用:以内存为基准,可以把文件中的数据以字符的形式读入到内存中去
构造器 | 说明 |
---|---|
public FileReader(File file) | 创建字符输入流管道与源文件接通 |
public FileReader(String pathName) | 创建字符输入流管道与源文件接通 |
方法名 | 说明 |
---|---|
public int read() | 每次读取一个字符返回,如果发现没有数据可读会返回-1 |
public int read(char[] buffer) | 每次用一个字符数组去读数据,返回字符数组读取了多少个字符,如果发现没有数据可读会返回-1 |
演示1
public class FileReaderTest1 {
public static void main(String[] args) {
// 每次读取单个字符
// try-with-resources:可自动关闭流,或者说可以自动关闭继承自AutoCloseable的类
try (
Reader reader = new FileReader("oop3\\src\\com\\ligemanyin\\_IO\\_FileReader\\经乱离后天恩流夜郎忆旧游书怀赠江夏韦太守良宰.txt");
) {
// 记录每次读取的字符编号
int c;
while ((c = reader.read()) != -1) {
System.out.print((char) c);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
演示2
public class FileReaderTest2 {
public static void main(String[] args) {
// 每次读取多个字符
try (
Reader reader = new FileReader("oop3\\src\\com\\ligemanyin\\_IO\\_FileReader\\经乱离后天恩流夜郎忆旧游书怀赠江夏韦太守良宰.txt");
) {
// 天上白玉京,十二楼五城。加上换行符一共13个字符
char[] buffer = new char[13];
// 记录每次读取了多少个字符
int len;
while ((len = reader.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, len));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
FileWriter(文件字符输出流)
- 作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去
构造方法 | 说明 |
---|---|
public FileWriter(File file) | 创建字节输出流管道与源文件对象接通 |
public FileWriter(String filePath) | 创建字节输出流管道与源文件路径接通 |
public FileWriter(File file boolean append) | 创建字节输出流管道与源文件对象接通,可追加数据 |
public FileWriter(String filePath boolean append) | 创建字节输出流管道与源文件对象接通,可追加数据 |
方法名 | 说明 |
---|---|
void write(int c) | 写一个字符 |
void write(String str) | 写一个字符串 |
void write(String str, int off, int len) | 写一个字符串的一部分 |
void write(char[] cbuf) | 写入一个字符数组 |
void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
注: 字符输出流写出数据后,必须刷新或关闭流,写出去的数据才能生效
方法名 | 说明 |
---|---|
public void flush() throws IOException | 刷新流,就是将内存中缓存的数据立即写到文件中去,即立即使写出去的数据生效 |
public void close() throws IOException | 关闭流,包含了刷新操作 |
演示
public class FileWriterTest1 {
public static void main(String[] args) {
// 创建一个文件字符输出流管道与目标文件接通
try (
// 追加数据,在构造器中fileName后添加true即可,在此不做演示
Writer writer = new FileWriter("oop3\\src\\com\\ligemanyin\\_IO\\_FileWriter\\writeTest1.txt")
) {
// 写一个字符
writer.write('x');
// 换行
writer.write(10);
// 写一个字符串
writer.write("流光容易把人抛,红了樱桃,绿了芭蕉\n");
// 写一个字符串的一部分
String str = "何处是归程?长亭更短亭";
// 何处是规程?
writer.write(str, 0, 6);
writer.write(10);
// 写一个字符数组
char[] chars = ("东武望余杭,\n云海天涯两渺茫。\n何日功成名遂了,\n还乡,\n" +
"醉笑陪公三万场,\n不用诉离殇,\n痛饮从来别有肠。\n今夜送归灯火冷,\n" +
"河塘,\n堕泪羊公却姓杨。").toCharArray();
writer.write(chars);
// 写字符数组的一部分
writer.write("\n\n");
writer.write(chars, 0, 53);
} catch (Exception e) {
e.printStackTrace();
}
}
}
字节流、字符流的使用场景小结:
- 字节流适合做一切文件数据的拷贝(音视频、文本、图片等),而字节流不适合读取中文内容输出
- 字符流适合做文本文件的操作(读、写)