第十章输入输出流与文件处理10.1输入输出流概述10.2字节流类10.3字符流类10.4文件处理10.1输入输出流概述1.什么是流流是一个很形象的概念。当程序需要读取数据的时候,就开启一个通向数据源的流,这个数据源可以是文件、内存或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据在这其中“流“动一样。10.1输入输出流概述2.流的分类按数据的传输方向,分为输入流和输出流。输入流是数据从外部设备(如文件)流向内存(程序)对输入流只能进行读操作输出流是数据从内存(程序)流向外部设备(如文件)对输出流只能进行写操作按处理的单位,分为字节流和字符流。10.1输入输出流概述3.流采用缓冲区技术对流进行读/写操作的最小单位是字节,传输效率低下。为提高传输速率,可将一块内存空间设计成缓冲区,暂存待传送的数据,这样一次可读/写若干字节。配备缓冲区的流称为缓冲流。在缓冲区写满之前若要进行数据传输,称为立即传输(flush)操作。10.1输入输出流概述4.流的作用与特点设计流的目的,是为了使数据传输独立于相关设备。程序中需要根据待传输数据的不同特性而使用不同的流,数据传输给指定设备后的操作由系统执行设备驱动程序完成,这样,程序中不需要关注设备实现细节,使得一个源程序能够用于多种输入/输出设备,从而增强了程序的可重用性。流的特点是数据的输入和输出必须按顺序进行,不能随机读取。10.1输入输出流概述5.java.io包中的类1)字节流InputStream类10.1输入输出流概述5.java.io包中的类1)字节流OutputStream类10.1输入输出流概述5.java.io包中的类2)字符流Reader类10.1输入输出流概述5.java.io包中的类2)字符流Writer类10.2字节流类字节流每次读写8位二进制数,由于它只能将数据以二进制的原始方式读写,而不分解、重组和理解这些数据,所以可以使之变换、恢复到原来的有意义的状态,因此字节流又被称为二进制字节流或位流。InputStream和OutputStream类是抽象类,定义了字节流的基本输入输出操作方法。由于不能创建它们的实例对象,故而它们派生出不同的子类,每个子类实现一种特殊的字节流输入或输出操作。10.2.1字节输入输出流1.InputStream类publicabstractintread()throwsIOExceptionpublicintread(byte[]b)throwsIOExceptionpublicintread(byte[]b,intoff,intlen)throwsIOExceptionpubliclongskip(longn)throwsIOExceptionpublicvoidclose()throwsIOException10.2.1字节输入输出流2.OutputStream类publicabstractvoidwrite(intb)throwsIOExceptionpublicvoidwrite(byte[]b)throwsIOExceptionpublicvoidwrite(byte[]b,intoff,intlen)throwsIOExceptionpublicvoidflush()throwsIOExceptionpublicvoidclose()throwsIOException10.2.1字节输入输出流3.标准输入输出在计算机系统中,标准输入是从键盘等外部输入设备中获得数据,标准输出是向显示器或打印机等外部设备发送数据。publicfinalstaticInputStreamin;publicfinalstaticPrintStreamout;publicfinalstaticPrintStreamerr;例10.110.2.2文件字节输入输出流类1.FileInputStream类publicclassFileInputStreamextendsInputStreampublicFileInputStream(Filefile)throwsFileNotFoundExceptionpublicFileInputStream(Stringname)throwsFileNotFoundException10.2.2文件字节输入输出流类2.FileOutputStream类publicclassFileOutputStreamextendsOutputStreampublicFileOutputStream(Filefile)throwsFileNotFoundExceptionpublicFileOutputStream(Stringname)throwsFileNotFoundException例10.210.2.3数据输入输出流1.DataInputStream数据字节输入流publicDataInputStream(InputStreamin)publicfinalbooleanreadBoolean()throwsIOExceptionpublicfinalbytereadByte()throwsIOExceptionpublicfinalshortreadShort()throwsIOExceptionpublicfinalcharreadChar()throwsIOExceptionpublicfinalintreadInt()throwsIOExceptionpublicfinallongreadLong()throwsIOExceptionpublicfinalfloatreadFloat()throwsIOExceptionpublicfinaldoublereadDouble()throwsIOException10.2.3数据输入输出流2.DataOutputStream数据字节输出流publicDataOutputStream(OutputStreamout)publicfinalvoidwriteBoolean(booleanv)throwsIOExceptionpublicfinalvoidwriteByte(intv)throwsIOExceptionpublicfinalvoidwriteShort(intv)throwsIOExceptionpublicfinalvoidwriteChar(intv)throwsIOExceptionpublicfinalvoidwriteInt(intv)throwsIOExceptionpublicfinalvoidwriteLong(longv)throwsIOExceptionpublicfinalvoidwriteFloat(floatv)throwsIOExceptionpublicfinalvoidwriteDouble(doublev)throwsIOException例10.310.2.4对象输入输出流1.ObjectInputStream对象字节输入流publicObjectInputStream(InputStreamin)throwsIOExceptionpublicfinalObjectreadObject()throwsIOException,ClassNotFoundException2.ObjectOutputStream对象字节输出流publicObjectOutputStream(OutputStreamout)throwsIOExceptionpublicfinalvoidwriteObject(Objectobj)throwsIOException例10.4——序列化接口java.io.Serializable10.3字符流类字符流一次读写16位二进制数,并将其作为一个字符而不是二进制位来处理。字符流的源和目标是文本文件,可以直接打开。10.3.1字符输入输出流1.Reader类publicabstractclassReaderextendsObjectimplementsReadable,Closeablepublicintread()throwsIOExceptionpublicintread(char[]cbuf)throwsIOExceptionpublicintread(char[]cbuf,intoff,intlen)throwsIOExceptionpublicvoidclose()throwsIOException10.3.1字符输入输出流2.Writer类publicabstractclassWriterextendsObjectimplementsAppendable,Closeable,Flushablepublicvoidwrite(intc)throwsIOExceptionpublicvoidwrite(char[]cbuf)throwsIOExceptionpublicvoidwrite(char[]cbuf,intoff,intlen)throwsIOExceptionpublicvoidwrite(Stringstr)throwsIOExceptionpublicvoidwrite(Stringstr,intoff,intlen)throwsIOException10.3.2文件字符输入输出流文件字符输入流FileReader和文件字符输出流FileWriter用于文本文件的输入输出处理,与文件字节输入流FileInputStream和文件字节输出流FileOutputStream的功能相似,但处理的基本单位是字符。publicFileReader(Stringname)throwsFileNotFoundExceptionpublicFileWriter(Stringname)throwsFileNotFoundException10.3.3字符缓冲流1.BufferedReader缓冲字符输入流publicBufferedReader(Readerin)publicStringreadLine()throwsIOException2.BufferedWriter缓冲字符输出流publicBufferedWriter(Writerout)publicvoidnewLine()throwsIOException例10.510.4文件处理文件是存储在外部存储介质上的具有标识名的一组相关信息的集合。文件系统性提供“按名存取”实现文件的存储和检索。树形目录结构文件分为文本文件和二进制文件。文件的存取方法有顺序存取、随机存取。10.4.2File类File类主要用于描述系统中的文件在磁盘上的存储情况,而File类的对象主要用来获取文件本身的一些信息,还可利用File对象来对文件系统做一些查询与设置的动作,但不涉及对文件的读写操作。不管是文件还是目录,在Java中都以File的实例来表示。10.4.2File类1.构造方法publicFile(Stringpathname)publicFile(Stringparent,Stringchild)publicFile(Fileparent,Stringchild)10.4.2File类2.成员方法publicbooleanexists()publicbooleancanRead()publiclonglastModified()publicStringgetAbsolutePath()publicStringgetName()publicbooleanisFile()publiclonglength()publicFile[]listFiles()publicbooleanmkdir()publicbool