河南大学软件学院2、File类3、字节流1、IO流概念及分类4、字符流5、随机访问流6、标准流7、对象序列化第七章流1、IO流概述及分类大部分程序都需要输入/输出处理,比如从键盘读取数据、向屏幕中输出数据、从文件中读或者向文件中写数据、在一个网络连接上进行读写操作等。在Java中,对数据的输出输入操作以流的方式进行,J2SDK提供了各种各样的流用以获取不同种类的数据。1、IO流概述及分类分类:按照数据的输入输出方式分为:输入流(InputStream)和输出流(OutputStream)输入流(InputStream)输出流(OutputStream)按照处理数据的单位不同分为字节流和字符流。1、IO流概述及分类(1)Java把处理二进制数据的流称为字节流,字节流每次处理一个字节的数据;以Stream结尾,说明是一字节流。(2)把处理某种格式的特定数据称为字符流,字符流每次处理一个字符的数据。以ReaderWriter结尾,说明是一字符流。按照流的功能不同分为节点流和过滤流。过滤流1、IO流概述及分类字节流字符流输入流InputStreamReader输出流OutputStreamWriterJ2SDK所提供的所有流类型位于java.io内都分别继承自以下四种抽象流类型。1、IO流概述及分类2、File类在Java中,专门提供了File类来获取和处理磁盘上文件和目录的相关信息。File类是java.io包中唯一处理磁盘文件和目录的类,它定义的对文件和目录操作的方法都是与平台无关的,通过使用File类提供的各种方法能够创建、删除文件和目录,获取磁盘上指定文件和目录的相关信息。File类的构造方法:File(StringfileName)完整路径或相对路径File(Stringdirectory,StringfileName)指定文件目录和文件名File(Filedirectory,StringfileName)使用File对象来表示文件目录注意:调用构造函数只能创建一个File对象,而不是在文件系统中创建了一个文件TestFile1.javaFilefile1=newFile(Hello.java);Filefile2=newFile(/);Filefile3=newFile(file2,Hello.java);Filefile4=newFile(/,Hello.java);例如:再如:如何创建一个文件或目录1、调用File对象的createNewFile()2、调用FileOutputStream()创建一个文件:创建一个目录:1、mkdir();创建父目录已经存在的目录2、mkdirs();创建多层目录注意:在Unix/Linux操作系统下,路径分隔符为“/”,而在Windows和DOS下的路径分隔符为“\”。Java对这两种分隔符都支持。但是如果使用“\”作为分隔符,注意要以转义字符“\\”来代替,例如以“c:\\sun\\jdk”表示“c:\sun\jdk”。在Java程序中,我们可以使用File.pathSeparator来表示与系统无关的路径分隔符。Stringseparator=File.separator;StringfileName=myfile.txt;Stringdirectory=mydir1+separator+mydir2;Filef=newFile(directory,fileName);File类的其它方法:见课本表7-2例子:7-1FileDemo.java3、字节流字节流类是专门处理以字节为传输单位的IO流类。我们知道计算机中的数据处理基本上都是以字节为单位进行处理,这类数据保存的文件也称为“二进制文件”,如果要读写这些二进制文件,就需要使用Java中的字节流对象。InputStream和OutputStream分别是输入字节流与输出字节流的抽象父类。InputStream抽象类及其派生子类方法说明publicvoidclose()关闭输入流以释放占用的系统资源publicabstractintread()从输入流中读取下一个字节的数据,返回该字节的ASCII码值,如果到文件的末尾,则返回-1publicintread(byte[]b)从输入流中读取一部分字节并将它们存放到字节数组b中,如果读取成功返回读取字节的个数,如果到文件的末尾返回-1publicintread(byte[]b,intoff,intlen)从输入流中读取len个字节将它们存放到字节数组b中,并且存放到b的从off位置后面。如成功返回读取字节的个数,否则返回-1InputStream类的主要方法OutputStream抽象类及其派生子类方法说明publicvoidclose()关闭输出流并释放占用的系统资源publicvoidflush()刷新输出流并强制写出所有缓冲区的数据publicabstractvoidwrite(intb)将一个指定的字节数据写到输出流中publicvoidwrite(byte[]b)将一个字节数组b中的全部数据写到输出流中publicvoidwrite(byte[]b,intoff,intlen)将一个字节数组b中从off位置开始长为len的字节写到输出流OutputStream类的主要方法FileInputStream类和FileOutputStream类FileInputStream和FileOutputStream称为文件流,是两个最常用字节流,用于对磁盘文件的读写操作。一旦创建了文件流对象,系统就会创建与指定文件对象链接的字节流,然后就可以利用提供的方法如read()、write()等方法对文件进行操作。FileInputStream类的主要构造方法FileInputStream类构造方法说明FileInputStream(Filefile)根据File类对象创建一个文件字节输入流对象FileInputStream(Stringname)根据字符串name创建一个文件字节输入流对象,name代表路径和文件名注意:如果File类对象所对应的文件不存在,将抛出FileNotFoundException异常。FileInputStreamfis=newFileInputStream(c:\\Hello.java);Filefile=newFile(c:\\Hello.java);FileInputStreamfin=newFileInputStream(file);TestFileInputStream.javaFileInputStream类构造方法说明FileOutputStream(Filefile)创建一个向file中写入数据的文件输出流FileOutputStream(Filefile,booleanappend)创建一个是否向file尾部追加数据的文件输出流FileOutputStream(Stringname)创建一个向name中写入数据的输出文件流FileOutputStream(Stringname,booleanappend)创建一个是否向name尾部追加数据的输出文件流FileOutputStream类的构造方法FileOutputStream类注意:如果File对象所对应的文件不存在,则会创建一个指定的文件。FileOutputStreamfos1=newFileOutputStream(f1.txt);FileOutputStreamfos2=newFileOutputStream(f2.txt,true);FileOutputStreamfos3=newFileOutputStream(newFile(f3.txt));FileOutputStreamfos4=newFileOutputStream(newFile(f4.txt),false);TestFileOutPutStream.javaFileOutputStream类•java.io包中提供了FilterInputStream类和FilterOutputStream类分别对其他输入/输出流进行特殊处理,它们在读/写数据的同时可以对数据进行特殊处理。FilterInputStream类和FilterOutputStream类都是抽象类,因此它们均不能实例化对象。•FilterInputStream类有3个子类,它们分别是BufferedInputStream、DataInputStream和PushbackInputStream;•FilterOutputStream类也有3个子类,分别是BufferedOutputStream、DataOutputStream和PrintStream。过滤流(处理流)BufferedInputStream和BufferedOutputStream类称为缓冲字节流,它引入了针对内存缓冲区的操作,从而提高了读写数据的效率。注意:过滤流不直接与底层的数据“打交道”,必须先指定节点流对象处理底层的数据,然后把节点流对象作为过滤流对象的实参使用。BufferedInputStream和BufferedOutputStream构造方法说明BufferedInputStream(InputStreamin)创建一个缓冲输入流并连结节点输入流in,缓冲区默认大小为32个字节BufferedInputStream(InputStreamin,intsize)创建一个缓冲输入流并连结节点输入流in,缓冲区默认大小为size个字节BufferedOutputStream(OutputStreamout)创建一个新的缓冲输出流,将数据写入到节点输出流out,缓冲区默认大小为32个字节BufferedOutputStream(OutputStreamout,intsize)创建一个新的缓冲输出流,将缓冲区大小为size字节的数据写入到节点输出流outBufferedInputStreamDemo.javaBufferedInputStream和BufferedOutputStream注意:1、BufferedInputStreamBufferedInputStream的数据成员buf是一个字节数组,默认为2048个字节,当读取数据来源时,BufferedInputStream会尽量将buf填满。当使用read()方法时,实际上是先读取buf中的数据,而不是直接对数据来源做读取。当buf不足是,BufferedInputStream才会在实现给定的InputStream对象的read方法。2、BufferedOutputStreamBufferedOutputStream的成员buf也是一个字节数组,默认为512字节,当使用write()方法写入数据时,实际上会先将数据写至buf中,当buf已满时才会实现给定的OutputStream对象的writer方法,将buf数据写至目的地。•java.io包中提供了ByteArrayInputStream类和ByteArrayOutputStream类,将内存中byte类型的数组当作流输入来源、输出目的地。ByteArrayInputStream可以从指定的字节数组中读取数据;ByteArrayOutputStream中提供了缓冲区可以存放数据(缓冲区大小可以在构造方法中设定,缺省为32字节),可以用write()方法向其中写入数据,然后用toByteArray()方法将缓冲区中的有效字节写到字节数组中去。构造方法说明ByteArrayInputStream(byte[]buf)创建一个内存输入流,使用buf作为其缓冲区数组ByteArrayInputStream(byte[]buf,intoffset,intlength)创建一个内存输入流,使用buf作为其缓冲区数组ByteArrayOutputStream()创建一个内存输出流ByteArrayOutputStream(intsize)创建一个缓冲区容量为size字节的内存输出流Byt