IO流-常用流对象(四)
-
文件字节流
FileInputStream通过字节的方式读取文件,适合读取所有类型的文件(图像、视频、文本文件等)。java也提供了FileReader专门读取文本文件。
FileOutputStream通过字节 方式写到数据文件中,适合所有类型的文件。java也提供了FileWriter专门写入文本文件。
-
文件字节输入流
import java.io.FileInputStream; public class FileStreamDemo { public static void main(String[] args) { FileInputStream fis=null; try { //创建文件字节输入对象 fis=new FileInputStream("d:/sxt.png"); int temp=0;//先定义一个临时变量 while ((temp = fis.read())!=-1){ System.out.println(temp); } }catch (Exception e){ e.printStackTrace(); }finally { try { if (fis!=null){ fis.close(); } }catch (Exception e){ e.printStackTrace(); } } } }
-
文件字节输出流
import java.io.FileInputStream; import java.io.FileOutputStream; public class FileStreamDemo { public static void main(String[] args) { FileInputStream fis=null; FileOutputStream fos=null; try { //创建文件字节输入对象 fis=new FileInputStream("d:/sxt.png"); //创建文件字节输出流 fos=new FileOutputStream("d:/aa.png"); int temp=0;//先定义一个临时变量 while ((temp = fis.read())!=-1){ fos.write(temp); } //将数据从内存中写入到磁盘中,刷新 fos.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (fis!=null){ fis.close(); } if (fos!=null){ fos.close(); } }catch (Exception e){ e.printStackTrace(); } } } }
-
-
通过缓冲区提高读写效率
-
方式一:通过创建一个指定长度的字节数组作为缓冲区,以此来提高IO流的读写效率。该方式适用于读取较大图片时的缓冲区定义。注意:缓冲区的长度一定是2的整数幂。一般情况下1024长度较为合适。
-
效率慢一点,对空间有节省。
import java.io.FileInputStream; import java.io.FileOutputStream; public class FileStreamBuffedDemo { public static void main(String[] args) { FileInputStream fis=null; FileOutputStream fos=null; try { //创建文件字节输入对象 fis=new FileInputStream("d:/itbz.png"); //创建文件字节输出流 fos=new FileOutputStream("d:/aa.png"); //创建一个缓冲区,提高读写效率 byte[] buff=new byte[1024];//相当于那个一个包,可以更快的运200斤的大米。不用在一粒一粒的搬 int temp=0;//先定义一个临时变量 while ((temp = fis.read(buff))!=-1){//这里的read()要选择有数组类型的 fos.write(buff,0,temp);//write选择三个参数的,buff数组相当于把包带进来,然后从大米里的包拿多少,当然是一次拿一包 } //我给的数组长度,起始从0开始,到temp(读完数组的长度),就相当于一次拿一整包大米 //将数据从内存中写入到磁盘中,刷新 fos.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
-
方式二:通过一个字节数组作为缓冲区,数组长度是通过输入对象的available()返回当前文件的预估长度来定义的。在读写文件时,是在一次读写操作中完成文件的读写操作的。注意:如果文件过大,那么对内存的占用也是较大的。所以大文件不建议使用该方法,还是建议用方式一。
-
效率快,但是浪费很多空间。
import java.io.FileInputStream; import java.io.FileOutputStream; public class FileStreamBuffer2Demo { public static void main(String[] args) { FileInputStream fis=null; FileOutputStream fos=null; try { //创建文件字节输入对象 fis=new FileInputStream("d:/itbz.png"); //创建文件字节输出流 fos=new FileOutputStream("d:/aa.png"); //创建一个缓冲区,提高读写效率 byte[] buff=new byte[fis.available()];//相当于那个一个包,用字节输入流的available()方法,返回文件的预估大小的值,也就是他要一次性拿走200斤的大米 int temp=0;//先定义一个临时变量 fis.read(buff);//直接一次读这个数组 fos.write(buff);//直接一次写这个数组,不用再去循环的读写操作了,因为力气大,直接一次扛走200斤大米 //将数据从内存中写入到磁盘中,刷新 fos.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
-
-
通过字节缓冲流提高读写效率
java缓冲流本身并不具有IO流的读取与写入功能,只是在别的流(节点流或处理流)上加上缓冲的功能提高效率,就像是把别的流包装起来一样,因此缓冲流是一种处理流(包装流)。
当对文件或者其他数据源进行频繁的读写操作时,效率比较低,这时如果使用缓冲流就能够更高效的读写信息。因为缓冲流是先将数据缓存起来,然后缓存区存满后或者手动刷新时再一次性的读取到程序或写入目的地。因此,缓存流还是很重要的,我们在IO操作时记得加上缓冲流来提高性能。
BufferedInputStream和BufferedOutputStrem这两个流是缓冲的字节流,通过内部缓存数组来提高操作流的效率。
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; public class FileStreamBuffered3Demo { public static void main(String[] args) { FileInputStream fis=null; FileOutputStream fos=null; BufferedInputStream bis=null; BufferedOutputStream bos=null; try { fis=new FileInputStream("d:/itbz.png"); bis=new BufferedInputStream(fis);//定义字节输入缓冲流,去嵌套文件字节输入流 fos=new FileOutputStream("d:/cc.png"); bos=new BufferedOutputStream(fos);定义字节输出缓冲流,去嵌套文件字节输出流 //缓冲流中的byte数组长度默认是8192 int temp=0; while ((temp=bis.read())!=-1){//利用嵌套完之后的缓存流去读数据 bos.write(temp);//利用嵌套完之后的缓存流去写数据 } }catch (Exception e){ e.printStackTrace(); }finally { try { //注意:关闭流的顺序:后开先闭 if (bis!=null){ bis.close(); } if (fis!=null){ fis.close(); } if (bos!=null){ bos.close(); } if (fos!=null){ fos.close(); } }catch (Exception e){ e.printStackTrace(); } } } }
- 关闭流的顺序处理图:
-
定义文件拷贝工具类
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; public class FileCopyTools { public static void main(String[] args) { copyFile("d:/itbz.png","d:/abc.png");//直接用了copyFile方法去完成了拷贝处理,给定源和目标的路径 } /** * 文件拷贝方法 */ public static void copyFile(String src,String des){//src:你从哪个位置拷贝文件(源),des:你的文件要拷贝到什么位置(目的地) FileInputStream fis=null; FileOutputStream fos=null; BufferedInputStream bis=null; BufferedOutputStream bos=null; try { bis=new BufferedInputStream(new FileInputStream(src));//src:从源去读取文件 bos=new BufferedOutputStream(new FileOutputStream(des));//des:拷贝到目的地 int temp=0; while ((temp=bis.read())!=-1){ bos.write(temp); } bos.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (bis!=null){ bis.close(); } if (fis!=null){ fis.close(); } if (bos!=null){ bos.close(); } if (fos!=null){ fos.close(); } }catch (Exception e){ e.printStackTrace(); } } } }