首先
有两个大类别,字符流和字节流
字节流
FileOutputStream
以字节为单位进行存储读出。
FileOutputStream中的write方法,就是把十进制整数转化为二进制,因为计算机的底层是二进制传递的,输出到硬盘的文本中,而在你打开文本之后,文本编辑器对该二进制代码进行解码,根据二进制转化的数字大小来查表,转化为字母或数字,汉字等。
例如
FileOutputStream x=new FileOutputStream("D:\\a.txt");
x.write(97);
x.close();
在文本中的结果为 a
转化过程如图所示:
FileInputStream
其中的read()方法就是在文件中读取一个字节,如果遇到汉字的情况(由于汉字一般占多个字节,就会出现一次读取一点的情况)
在文件中所有数据都是由二进制存储的,遇到汉字时读取一个字节,下一个字节则在下一次读取。
读取完字节以后传回内存,转化为十进制表示。
字符流
读和写都是一个字符,
重点是FileWriter
writer(int)方法,他把十进制数转化为字符再把字符写入缓冲区,然后转化为字节,后面跟字节流一样了。
所以要求调用flush方法。
缓冲流
转化流
注:字符流中会调用字节流,如图所示
在由FileReader读取数据时,其实也是通过调用了FileInputStream,来把文件中的字符转化为字节,从而自己由默认的编码表解码,把字节转化为字符。
FIleReader存在限制,只能使用默认的,而他的父类,InputStreamReader可以采用任意的编码表解码,来进行转换
写入数据时则同理
单独使用FileInputStream时没有解码过程
public class TestMain {
public static void main(String[] args) throws IOException {
FileOutputStream x=new FileOutputStream("D:\\a.txt");
x.write(65);
FileInputStream y=new FileInputStream("D:\\a.txt");
System.out.println(y.read());
}
}
最后两个流相当于是对类的一个包装