JAVA I/O系统
一、流的分类
1.按照方向分为:
(1)输入流:从数据源读取数据到程序中。只能从中读取数据,不能向其中写入数据。IO包中的输入流都继承自抽象类InputStream或Reader。
(2)输出流:经数据从程序写入数据目的地。只能从中写入数据,而不能从中读取数据,IO包中的输出流都继承自抽象类OutputStream和Writer。
在I/O 库中的每个输入流都可以找到对应的输出流。
2.按照处理数据的最小单位不同分为:
(1)字节流:字节流是一byte为最小单位进行数据传送,io包中的字节流都继承自抽象类InputStream或OutputStream.
(2)字符流:字符流是以char为最小单位进行数据传送。io包中的字符流都是继承自抽象类Reader或者Writer。
I/O库做出这种区分是为了满足处理文字性数据的需要。byte是8位的,char是16位的。在JAVA中,各种语言文字都是以Unicode形式编码,Unicode编码是基于16位的char,所以在读写文字性的数据时通过字符流会更有效率、更方便。而一些二进制数据的读写,比如图像、声音等,则仍必须通过字节流来完成。
字节流的类名以InputStream或OutputStream结尾,字符流的类名以Reader或Writer结尾。字节流对应的内存变量类型是byte[],字符流对应的内存变量类型是char[]。
3.按照流的功能分为:
(1)节点流:节点流是可以直接从或者向一个特定的数据源读写数据的流。也成为低级流。
从InputStream或Reader派生的类都有一个基本的read()方法,用于读取单一的字节或者字节数组;对所有从OutputStream或Writer派生的类都有一个基本的write()方法,用于写入单一的字节或者整个字节数组。
(2)处理流:处理流不直接连接到设备,而是连接在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更强大的读写功能,也成为高级流。
区分高级流和低级流:查看该类的构造器,如果类的构造器带有一个已存在的流作为参数,那么就是高级流,否则就是低级流。
I/O操作步骤:
(1)建立流:根据数据源和具体操作选择流,然后建立流。创建内存到数据源之间的数据通道,以传输数据。
(2)操作流:将数据读取到内存,或将内存中的数据写入数据源。
(3)关闭流:流操作结束后,释放所有与该流相关联的系统资源。
二、文件类
java.io包中的File类提供了管理磁盘文件和目录的基本功能。我们可以将一个File对象看成是代表一个文件或目录的名称和位置的字符串。File类有四个构造方法:
public File(String pathname):创建一个与指定路径名关联的File对象。
public File(String parent,String child):使用指定参数创建一个File对象。参数parent代表一个目录,参数child代表在parent中的子目录或文件。
public File (File parent,String child):与上一个相同,除了目录是用一个File对象而不是一个字符串来表示。
public File(URI uri):使用给定的java.net.URI对象创建一个File对象。URI是统一资源标识符,一个文件的URI是“File:///目录/文件名”格式。
因为File对象类似于一个字符串,只代表了一个文件或者目录的路径名,所以即使指定的文件或目录不存在,这些构造器也能成功执行。
三、字节流
字节流用于处理二进制文件。所有字节流都继承于抽象类InputStream和OutputStream两个父类。其中InputStream为读取字节流的父类,OutputStream为写入字节流的父类
1.低级字节流
根据输入和输出设备或数据源分为三类:
(1)对二进制文件进行读写操作的FileInputStream和FileOutputStream类,其数据源是磁盘文件。
(2)对内存缓冲区的字节数组进行读写操作的ByteArrayInputStream和ByteArrayOutputStream类,其数据源是内存中的字节数组。
(3)对线程管道进行读写操作的PipedInputStream和PipedOutputStream类,其数据源是线程管道。
2.高级字节流
高级字节流对低级字节流进行了封装,并有许多功能的扩展。
(1)字节缓冲流
BufferedInputStream和BufferedOutputStream可以为InputStream和OutputStream类的对象增加缓冲区功能。BufferedInputStream的数据成员b是一个字节数组默认为2048个字节。当读取数据源时,BufferedInputStream会尽量b填满。当使用read()方法时,实际上是先读取数据成员b的数据而不是直接读取数据源。当b中的数据不足时,才会再实现给定的InputStream对象的read()方法,从指定的设备中提取数据。
BufferedOutStream的数据成员是一个字节数组,默认为512字节。当使用write()方法,会先将数据写至数据成员b中,当b已满时才会实现给定的OutputStream对象的write()方法,将b数据写至目的地,而不是每次都对目的地作写入的动作。
四、字符流
字符流用于处理文本文件。所有字符流都继承于抽象类Reader和Writer两个父类。其中Reader为读取字符流的父类,Writer为写入字符流的父类。
Reader与InputStream相似,用于从流中读取数据,Reader是以字符为单位读取数据。
Writer和OutputStream相似,用于从流中写入数据,Writer是以字符为单位写入数据。