一、java IO流简介
java IO流是一组有顺序的字节序列,通过流我们可以进行硬盘文件、内存、IO设备等数据的流通。IO流根据处理类型不同可以分为字节流和字符流;根据流向不同可以分为输入流和输出流。
字节流一次读入或者读出8位(1byte=8bit)二进制;而字符流以字节(byte)为单位,根据码表映射字符,一次可能读取多个字节。设备上的文字、图片、视频等都是用二进制存储的,所以所有的文件都能通过字节流读取或者写入;另外,对于纯文本(如txt)来说,根据数据编码不同,才用字符流来进行读写,能够提高操作效率,字符流本质是基于字节流读取时,查了指定的编码表。
结论:字节流什么文件都能读写,字符流只能操作纯文本,而且如果是纯文本,优先用字符流,效率高。
二、IO流类图
三、字节流(输入流和输出流)
InputStream和OutputStream分别为字节输入流和字节输出流的父类,它们是抽象类。ByteArrayInputStream、StringBufferInputStream、FileInputStream 和 ByteArrayOutputStream、FileOutputStream是五种基本的介质流, 它们分别从Byte数组、StringBuffer、本地文件读取数据 和 分别向Byte数组、本地文件写入数据。
另外:PipedInputStream 、PipedOutputStream 是从与其它线程共用的管道中读写数据。ObjectInputStream 、ObjectOutputStream 和所有FilterInputStream、FilterOutputStream 的子类都是装饰流(装饰器模式的主角)。
字符流 Reader和Writer不做介绍了。
四、节点流和处理流
1、节点流
节点流就是直接与数据源相连,直接读取或写入。
本地文件 数组 字符串 管道直接与数据源相连,就是节点流 。
2、处理流
处理流就是在节点流上套接一层,套接在节点流上的就是处理流,处理流的构造方法总是要带一个其他流的对象做参数。
3、引入缓冲流的目的
在已经有了inputStream、OutputStream、 FileInputStream、FileOutputStream的情况下,为什么还要引入BufferedInputStream和BufferedOutputStream呢?
我们知道inputStream、OutputStream流不带缓存区,也就是每读一个字节就要写一个字节,这样会频繁的I/O操作,效率太低;节点流FileInputStream、FileOutputStream是用byte数组来做了缓存;BufferedInputStream和BufferedOutputStream流是带缓冲区的,它可以一次读取很多个字节,而不向磁盘写入,只是先放到缓冲内存中,等凑够缓存区大小的时候一次性写入磁盘,这样就减少了I/O操作,提高了效率。
五、File类介绍
File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
六、总结
1、涉及到本地文件、文件系统读写文件,可以用FileInputStream和FileOutputStream;
比如:从本地一个文件把数据读取到另一个文件
FileInputStream in = null; 9 FileOutputStream out = null; 10 try { 11 in = new FileInputStream("D:\\Java\\MyEclipse 10\\Workspaces\\AnnotationTest\\src\\cn\\galc\\test\\MyMouseAdapter.java"); 12 out = new FileOutputStream("D:/java/TestFileOutputStream1.java"); 13 // 指明要写入数据的文件,如果指定的路径中不存在TestFileOutputStream1.java这样的文件,则系统会自动创建一个 14 while ((b = in.read()) != -1) { 15 out.write(b); 16 // 调用write(int c)方法把读取到的字符全部写入到指定文件中去 17 } 18 in.close(); 19 out.close();
当然,用相应的缓存流来处理效率更高
BufferedInputStream bis =new BufferedInputStream(new FileInputStream(new File("文件路径")));
int i =0 ;
while((i = bis.read())!=-1){ //i 就是从文件中读取的字节,读完后返回-1 }
FileOutputStream fos =new FileOutputStream(file);
BufferedOutputStream bos=new BufferedOutputStream(fos);
bos.write(要写出的字节或者字节数组);
bos.flush();
bos.close();