一.I0输入流/输出流
1.1 File类 :它是IO中唯一代表磁盘文件本身信息的类,而不是文件内容。
File类定义一些与平台无关的方法来操纵文件。
我们通过File类所提供的方法可以对文件进行如下操作:
创建文件:createNewFile(); 删除文件:delete();
获得文件的名称:getName(); 获得文件的路径:getPath();
获得文件的父目录:getParent(); 获得文件的绝对路径:getAbsolutePath();
判断文件是否存在:exists(); 判断文件是否是目录:isDirectory();
判断文件是否可读:canRead(); 取出文件的修改时间:lastModified(); 等
1.2 以下是IO流中的关系图
字节输入流类
1>InputStream和OutputStream:
是所有输入流的抽象基类。它并没有对应到具体的流设备,只描述了所有流设备的共性。
也就 是描述了各种输入流类读取数据的通用方法。
对于对应的管道、网络、内存、文件等具体IO设备的那些流,都是InputStream的子类。
2>FileInputStream和FileOutputStream:
用来创建磁盘文件的输入流对象,通过他们的构造函数来指定文件的路径和文件名称。
可以指定还不存在的文件名,但是不能指定已经被其他程序打开了的文件。
3>ObjectInputStream和ObjectOutputStream:
它是一个包装类,用于从底层输入流中读取对象类型的数据。
他们所读取的对象必须实现 Serializable接口。对象中的transient和static类型的成员变量不会被读取和写入。
Serializable是一种标记,用来标记此对象可进行序列化操作。
4>PipedInputStream和PipedOutputStream:
它是用于在应用程序中创建管理通信的一个类。
一个PipedInputStream对象必须与PipedOutputStream对象进行连接,产生一个通信管道.
PipedOutputStream可以向管道中写入数据,PipedInputStream可以向管道中读取数据。
这两个类主要完成线程之间的通信。
使用管道流类,可以实现各个程序模块之间的松耦合通信
5>SeqenceInputStream: 将若干个InputStream类合并成一个整体的InputStream类。
6>StringBufferInputStream和StringBufferOutputStream:
它是作为字符的缓冲区。
缓冲流为IO流增加了内存缓冲区,增加缓冲区有两个基本目的:
允许java程序一次不只操作一个字节,这样提高了程序的性能。
由于有了缓冲区,使得在流上执行skip、mark和reset方法都成为可能。
BufferedInputStream和BufferedOutputStream是java提供的两个缓冲区包装类,不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。
7>ByteArrayInputStream和ByteArrayOutputStream:
它是作为字节的缓冲区。用于以IO流的方式来完成对字节数组内容的读取和写入,来支持类似内
存虚拟文件或者内存映像文件的功能。
8>FilterInputStream和FilterOutputStream:
所有输入输出包装类的基类。如果要定义自己的输入输出包装类,就需要继承此类。
9>DataInputStream和DataOutputStream:
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。 DataInputStream 对于多线程访问不一定是安全的。
提供了往各种输出流对象中写入各种类型的数据(当然包括浮点小数)的方法。
字符输入流类
Reader和Writer是所有字符流类的基类,描述了各种字符流读取和写入数据的通用方法。
用于简化对字符串的输入输出编程,即用于读写文本数据。
图上的其他子类都是分别提供了各自的方法,以便应对不同情况下,对字符流的操作。
字符流和字节流的作用类似,这里不在一一解释。
要点:FileWriter 的 write方法内部没有调用flush()刷新方法。所以一定要调用flush方法,或者记得关闭流资源调用close方法。这样才能把字符写入到文件中去。
对于写入字节数组时,write方法会调用内部的flush方法来刷新缓冲区。其他的则不调用flush方法。
关闭流栈中最上层的流对象,将会自动关闭流栈中的所有底层流对象。
有了垃圾回收器,为什么还要调用close方法呢?
一个对象,在没有引用变量指向它的时候,它就会变成垃圾,最终会被垃圾回收器从内存中清除。当程序创建了IO流资源对象的同时,也会创建一个叫流的东西。在这种情况下,计算机内存中实际上产生了2个事物,一个是java程序的类实例对象,一种是系统本身产生的某种资源,java垃圾回收器只能管理程序中的类实例对象,不会管理系统所产生的那些资源,所以我们程序只有调用自己流对象的close方法,去通知系统释放对象所表示的流资源。
为什么要使用内存缓冲区?缓冲区的作用?
在应用程序和IO设备之间通常都会有一个内存缓冲区,这是由于计算机访问IO设备的速度要比直接访问内存的速度慢的多。
创建内存缓冲区后,应用程序先把数据写入到内存缓冲区中,然后从缓冲区中把数据一次写入到IO中。
使用数据缓冲区,有2方面的好处:
1. 提高了CPU的使用率
2. Read()方法并没有真正的把数据写入到IO设备,程序还有机会撤回部分写入的数据。
使用缓冲区能够提高整个计算机系统的效率,但也会降低单个程序自身的效率。
流操作的基本规律:
最痛苦的就是流对象有很多,不知道该用哪一个。
通过三个明确来完成。
1.明确:源和目的。
源:输入流。 InputStream Reader
目的:输出流。 OutputStream Writer
2.明确:操作的数据是否是纯文本。
是:用字符流。
否:用字节流。
3.当体系明确后,在明确要使用哪个具体的对象。通过设备来进行区分。
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台。
1.将一个文本文件中的数据存储到另一个文件中。(复制文件)
源:文本文件。InputStream Reader 因为是源所以使用读取流。
是不是操作文本文件:
是:这时就选择Reader.这样体系就明确了。
接下来明确对象:要是用该体系的哪些对象。
明确设备:硬盘。(硬盘上的一个文件)
Reader体系中可以操作文件的对象是FileReader.
是否需要提供效率:
是:加入Reader体系中缓冲区 BufferedReader.
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
详情请查看:http://edu.csdn.net/heima