一、字符流
所有的文件都是字节文件,而只有文本文件的数据可以称为字符。
1、字符输入流父类Reader
方法 | 说明 |
---|---|
close() | 关闭流资源 |
read() | 读取一个字符 |
read(char[] chs) | 读取一个字符数组的内容 |
2、FileReader类
构造方法
方法 | 说明 |
---|---|
FileReader(File file) | 使用File对象的路径创建输入流 |
FileReader(String fileName) | 使用字符串路径创建输入流 |
- 代码演示
构造方法演示:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class Test01 {
public static void main(String[] args) throws FileNotFoundException {
//字符输入流构造方法
/*
注意事项:
1.如果文件不存在,输入流会报错(系统找不到指定的文件。)
2.如果写的是文件夹,流对象都会报错(拒绝访问。)
*/
//FileReader(File file)
//使用File对象的路径创建输入流
//FileReader fr = new FileReader(new File("day10\\123.txt"));
//FileReader(String fileName)
//使用字符串路径创建输入流
FileReader fr2 = new FileReader("day10\\123.txt");
}
}
常用读取方法演示(一次读取一个字符和一次读取字符数组):
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Test02 {
public static void main(String[] args) throws IOException {
//字符输入流的常用方法
FileReader fr = new FileReader("C:\\Users\\jin\\Desktop\\文件复制.java");
// FileInputStream fr = new FileInputStream("C:\\Users\\jin\\Desktop\\文件复制.java");
//read() :读取一个字符
//返回的是字符对应的数值
//如果读到了文件的末尾会返回-1
//int i;
//while((i=fr.read()) != -1){
// System.out.println((char)i);
//}
//read(char[] chs): 读取一个字符数组的内容
//读取返回的是读取到的字符个数,如果读到了末尾会返回-1
char[] chs = new char[5];
int len;
while((len=fr.read(chs)) != -1){
System.out.println(new String(chs,0,len));
}
//close()
//关闭流资源
fr.close();
}
}
3、字符输出流父类Writer
常用方法
方法 | 说明 |
---|---|
close() | 关闭流资源 |
flush() | 刷新 |
write(int c) | 写出一个字符 |
write(char[] cbuf) | 写出一个字符数组的内容 |
write(char[] b, int off, int len) | 写出一个字符数组的一部分 |
write(String str) | 写出一个字符串 |
4、FileWriter类
构造方法
方法 | 说明 |
---|---|
FileWriter(File file) | 用File对象所表示的路径创建输出流对象 |
FileWriter(String fileName) | File字符串所表示的路径创建输出流对象 |
FileWriter(File file,boolean b) | 用File对象所表示的路径创建输出流对象,true表示续写 |
FileWriter(String fileName,boolean b) | File字符串所表示的路径创建输出流对象,true表示续写 |
- 代码演示
构造方法演示:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Test03 {
public static void main(String[] args) throws IOException {
//字符输出流构造方法
/*
注意事项:
1.如果文件不存在,输出流会创建文件
2.如果文件已存在,输出流会覆盖文件
3.所有流只能操作文件,不能操作文件夹(拒绝访问。)
4.如果构造加了参数true 表示不清空文件 续写
*/
//FileWriter(File file)
//用File对象所表示的路径创建输出流对象
//FileWriter fw = new FileWriter(new File("day10\\123.txt"));
//FileWriter(String fileName)
//File字符串所表示的路径创建输出流对象
//FileWriter fw2 = new FileWriter("day10\\123.txt");
//FileWriter(File file,boolean b)
//用File对象所表示的路径创建输出流对象,true表示续写
//FileWriter fw = new FileWriter(new File("day10\\123.txt"),true);
//FileWriter(String fileName,boolean b)
//File字符串所表示的路径创建输出流对象,true表示续写
FileWriter fw2 = new FileWriter("day10\\123.txt",true);
}
}
- 常用方法演示
常用方法:
import java.io.FileWriter;
import java.io.IOException;
public class Test05 {
public static void main(String[] args) throws IOException {
//创建对象
FileWriter fw = new FileWriter("day10\\123.txt");
//write(int c)
//写出一个字符
fw.write(97);
fw.write('a');
fw.write('我');
//write(char[] cbuf)
//写出一个字符数组的内容
char[] chs = {'a','b','c','我','爱','你'};
fw.write(chs);
//write(char[] b, int off, int len)
//写出一个字符数组的一部分
//输出“我爱你”这部分,3索引开始输出3个
fw.write(chs,3,3);
//write(String str)
//写出一个字符串
fw.write("石原里美");
//关闭资源
fw.close();
}
}
- 关闭和刷新
字符输出流底层有一个缓冲区,输出的字符会被先放在缓冲区。
当调用刷新或者是缓冲区放满时才会真正的输出到文件中。
close()方法自带刷新功能,只要最后记得关流,中间可以不做刷新。
import java.io.FileWriter;
import java.io.IOException;
public class Test04 {
public static void main(String[] args) throws IOException {
//字符输出流的常用方法
FileWriter fw = new FileWriter("day10\\123.txt");
//输出
fw.write(97);
fw.write(97);
//flush()
//刷新(可以把缓冲区的数据刷新到文件中)
//close()
//关闭方法其实自带了刷新功能
//在最后只要调用了关闭就可以把缓冲区的内容全部放到文件中
//关闭流资源
fw.close();
}
}
常见错误:
//要求:给文件输出123456789
//-------使用字节输出流不好做------------------------
//创建字节输出流
FileOutputStream fos = new FileOutputStream("day10\\123.txt");
//循环
for (int i = 1; i < 10; i++) {
fos.write(i);
}
//关流
fos.close();
-------使用字符输出流好做------------------------
//创建字符输出流
FileWriter fos = new FileWriter("day10\\123.txt");
//循环
for (int i = 1; i < 10; i++) {
fos.write(i+"");
}
//关流
fos.close();
简单结论:
字节流:
用于操作非文本数据(也可以操作文本数据但是我们不用)
字符流:
用于操作文本数据(不能操作非文本数据)