IO流分类
1)按照流向分类:
输入流:读取数据用的
输出流:写数据用的
2)按照读写的数据分类(体系结构)
<1>字节流[读写任何类型的文件(任何文件底层都是字节数据)]
字节输入流:IntputStream(抽象类)
–FileInuptStream: 读取文件中的字节
–BufferedInputStream: 对InputStream进行包装,提高读取数据的效率
字节输出流: OutputStream(抽象类)
–FileOutputSteam: 往文件中写字节
–BufferedOutputStream: 对OutputStream进行包装,提高写入数据的效率
1)普通字节流复制//创建流对象FileInputStream fis = new FileInputStream("文件路径");FileOutputStream fos = new FileOutputStream("文件路径");//一次读写多个字节byte[] bs = new byte[1024]; //1024byte=1kbint len; //记录每次读取的字节个数while((len=fis.read(bs))){//把读取到的有效字节数据,写入目标文件中fos.write(bs,0,len);}//释放资源fis.close();fos.close();2)缓冲字节流复制//创建流对象BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件路径"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("文件路径"));//如果是一次读一个字节,则read返回的是读取的字节//一次读写多个字节byte[] bs = new byte[1024]; //1024byte=1kbint len; //记录每次读取的字节个数,读取的内容存储到字节数组中while((len=bis.read(bs))!=-1){//把读取到的有效字节数据,写入目标文件中bos.write(bs,0,len);}//释放资源bis.close();bos.close();
<2>字符流[只能读取文本文件(用记事本打开能读懂的就是文本文件)]
字符输入流:Reader(抽象类)
–FileReader: 读取文件中的字符数据
–BufferedReader: 对FileReader进行包装,提高读取字符的效率
字节输出流: Writer(抽象类)
–FileWriter: 往文件中写字符数据
–BufferedWriter: 对FileWriter进行包装,提高写入字符的效率
1)普通字符流复制//创建流对象FileReader fr = new FileReader("文件路径");FileWriter fw = new FileWriter("文件路径");//一次读写多个字符char[] bs = new char[1024]; //1024byte=1kbint len; //记录每次读取的字节个数while((len=fr.read(bs))!=-1){//把读取到的有效字节数据,写入目标文件中fw.write(bs,0,len);}//释放资源fr.close();fw.close();2)字符缓冲流复制//创建流对象BuferedReader br = new BufferedReader(new FileReader("文件路径"));BuferedWriter bw = new BuferedWriter(new FileWriter("文件路径"));//一次读一行String line; //记录每次读取的那一行while((line=br.readLine())!=null){//把读取到的有效字节数据,写入目标文件中bw.write(line);bw.newLine(); //换行,具备跨平台性bw.flush; // 刷新}//释放资源br.close();bw.close();
3)字节流以及字符流的注意事项:
<1>为什么字节流读取文本文件,可能会出现乱码?
字节流一次读一个字节,而不管GBK还是UTF-8一个中文都是多个字节,用字节流每次只能读其中的一部分,所以就会出现乱码问题。
<2>字符流怎么解决乱码问题
通过字符串的getBytes(“码表名”) 和 new String(byte1, “码表名”)进行编码和解码
<3>字符流写数据
a.创建字符输出流对象:如果文件不存在,就新建,但是要保证父级路径的存在
如果文件存在就清空
b.写数据:写出int类型的整数,实际写出的是整数在码表上对应的字母
写出字符串数据,是把字符串本身原样写出。
<4>字符流底层为【字节流+编码表】