一、IO流的分类
按照流向:
输入流 读取数据 FileReader 父类是Reader
输出流 写出数据 FileWriter 父类是Writer
按照数据类型:
字节流:
字节输入流 读取数据 InputStream
字节输出流 写出数据 OutputStream
字符流:
字符输入流 读取数据 Reader
字符输出流 写出数据 Writer
因为计算机底层数据存储的单位全是字节,为了方便读取多个字节才有了字符流。
二、字符流复制文本文件
FileReader fr=new FileReader("a.txt");
FileWriter fw=new FileWriter("b.txt");
//一次读写一个字符
/*int ch;
while((ch=fr.read())!=-1){
fw.write(ch);
fw.close();*/
//一次读写一个字符数组
int len;
int[] chs=new int[1024];
while(len=fr.read(chs)!=-1){
fw.write(ch,0,len);
fw.close();
}
}
三、InputStream和OutputStream(所有字节流的超类)
字节流可以不刷新数据,字符流是写到缓冲区需要刷新。
二进制文件(视频,音频,图片)只能使用字节流进行复制,文本文件俩个都可以使用,计算机中的数据底层是字节,我们可以使用字节流复制任何的文件,字符流在读取文件写文件时参考码表,码表会对字节进行合并成,有的码表俩个字节一个字符,有的三个字节合并一个字符,在合并的过程中会丢失,这时图片就打不开了。
//跟字符流大同小异
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileCopy {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("a.txt");
FileOutputStream fos=new FileOutputStream("b.txt");
//一次读取一个字节
// int by;
// while((by=fis.read())!=-1) {
// fos.write(by);
// }
//一次读取一个字节数组
int len;
byte[] bys=new byte[1024];
while((len=fis.read(bys))!=-1) {
fos.write(bys,0,len);
}
fis.close();
fos.close();
}
}
四、标准输入流和标准输出流
public static final InputStream in;字节输入流,用来读取键盘录入的数据
InputStream is=System.in;
public static final OutputStream in;字节输出流,将数据输出到命令行
五、OutputStreamWriter的概述和使用
问题:读取项目根目录下的a.txt,并输出到命令行
六、InputStreamWriter的概述和使用
问题:读取键盘录入的数据,并输出到项目根目录下的a.txt文件中
数据源:键盘录入的数据 System.in (字节流)
目的地:根目录下的a.txt文件 FileWriter (字符流)
转换流:把字节输入流转换成字符输入流
七、打印流PrintWriter的概述
可以自动换行
不能输出字节,但是可以输出其他任意类型
通过某些配置可以实现自动刷新,(只有调用println(),printf或者format才有用)
只能输出不能输入