面向对象程序设计第7章

上传人:hs****ma 文档编号:568547292 上传时间:2024-07-25 格式:PPT 页数:36 大小:128KB
返回 下载 相关 举报
面向对象程序设计第7章_第1页
第1页 / 共36页
面向对象程序设计第7章_第2页
第2页 / 共36页
面向对象程序设计第7章_第3页
第3页 / 共36页
面向对象程序设计第7章_第4页
第4页 / 共36页
面向对象程序设计第7章_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《面向对象程序设计第7章》由会员分享,可在线阅读,更多相关《面向对象程序设计第7章(36页珍藏版)》请在金锄头文库上搜索。

1、第第 7 章章流式流式输入输出及文件处理输入输出及文件处理17.1 7.1 流式输入输出处理机制流式输入输出处理机制 在在JavaJava语语言言中中,所所有有的的输输入入输输出出操操作作都都采采用用流流式式处处理理机机制制。所所谓谓流流是是指指具具有有数数据据源源和和数数据据目目标标的的字字节节序序列列的的抽抽象象表表示示。可可以以将将数数据据写写入入流流中中,也也可可以以从从流流中中读读取取数数据据,实实际际上上流流中中存存放放着着以以字字节节序序列列形形式式表表示示的的准准备备流流入入程程序或流出程序的数据。序或流出程序的数据。2当当试试图图将将程程序序中中的的数数据据输输出出到到输输出

2、出设设备备时时,需需要要将将这这些些数数据据以以字字节节序序列列的的形形式式写写入入流流中中,此此时时的的数数据据源源是是程程序序,数数据据目目标标是是输输出出设设备备,这个流被称为输出流(这个流被称为输出流(output streamoutput stream)。)。程序程序输出设备输出设备数据源数据源数据目标数据目标数据数据3当试图将外部的数据输入到程序中时,流中的当试图将外部的数据输入到程序中时,流中的数据源是输入设备,数据目标是程序,这个流数据源是输入设备,数据目标是程序,这个流被称为输入流(被称为输入流(input streaminput stream)。)。输入设备程序数据源数据源

3、数据目标数据目标数据数据4 JavaJava程程序序使使用用流流机机制制处处理理输输入入输输出出的的主主要要好好处处是是可可以以使使程程序序中中有有关关输输入入输输出出的的代代码码与与设设备备无无关关,这这样样既既可可以以免免去去了了解解每每一一种种设设备备的的细细节节而而带带来来的的烦烦恼恼,也也可可以以使使得得程程序序适适应应各各种设备的输入输出。种设备的输入输出。5 流的基本处理单位为流的基本处理单位为字节字节。如果每次只。如果每次只读写一个字节,会使得数据传输效率非读写一个字节,会使得数据传输效率非常低,因此通常为流配备一个缓冲区常低,因此通常为流配备一个缓冲区(buffer)(buf

4、fer),将这种流称为缓冲流。,将这种流称为缓冲流。缓冲区数据源目标源6 在在JavaJava语语言言中中,支支持持输输入入输输出出流流的的所所有有类类被被放放置置在在java.iojava.io包包中中,其其中中主主要要包包含含二进制流二进制流和和字符流字符流。 当当以以二二进进制制字字节节序序列列的的形形式式写写数数据据时时,写写到到流流中中的的数数据据与与内内存存中中的的形形式式完完全全一一样样,即即没没有有发发生生任任何何变变化化。当当以以字字符符的的形形式式写写数数据据时时,由由于于JavaJava中中的的字字符符采采用用UnicodeUnicode编编码码,占占据据1616个个二二

5、进进制制位位,因因此此,写写入入的的每每个个字字符符为为两两个个字字节节,先先写写高高字字节,后写低字节。节,后写低字节。77.2 Java7.2 Java的输入输出流库的输入输出流库 7.2.1 Java7.2.1 Java的输入输出流库的输入输出流库 File File 支持文件或目录操作的类支持文件或目录操作的类 OutputStreamOutputStream 字节字节流输出操作的抽象类流输出操作的抽象类 InputStreamInputStream 字节字节流输入操作的抽象类流输入操作的抽象类 Writer Writer 字符字符流输出操作的抽象类流输出操作的抽象类 Reader R

6、eader 字符字符流输入操作的抽象类流输入操作的抽象类 RandomAccessFileRandomAccessFile 支持支持随机存取随机存取文件类文件类87.2.2 7.2.2 字节输入流字节输入流InputStreamInputStream 字字节节流流是是以以字字节节序序列列的的形形式式读读写写数数据据的的方方式式。从从输输入入设设备备或或文文件件中中读读取取数数据据使使用用的的字字节节流流被被 称称 为为 输输 入入 流流 , 在在 JavaJava语语 言言 中中 用用InputStreamInputStream类类描描述述,并并提提供供了了下下面面几几个个用用于读取数据的成员

7、方法:于读取数据的成员方法:read()read()read(byte buffer)read(byte buffer)read(byte read(byte buffer,intbuffer,int offset,intoffset,int length) length)skip(long n)skip(long n)close()close()97.2.3 7.2.3 字节输出流字节输出流OutputStreamOutputStream OutputStreamOutputStream类类是是一一个个抽抽象象类类,它它将将作作为为所所有有字字节节输输出出流流类类的的父父类类,在在这这个类中

8、包含下面个类中包含下面5 5个主要的成员方法:个主要的成员方法: write(intwrite(int b) b) write(byte buffer)write(byte buffer) write(byte write(byte buffer,intbuffer,int offset,intoffset,int length) length) flush()flush() close()close()107.3 7.3 文件文件 利利用用文文件件组组织织和和存存储储数数据据是是一一种种常常用用的的方方式式。在在JavaJava语语言言中中,根根据据对对文文件件的的存存取取方方式式不不同同,

9、提提供供了了两两个个类类用用来来描描述述文文件件及及实实现现文文件件的的各各种种操操作作。一一个个类类是是FileFile类类,用用来来支支持持顺顺序序文文件件的的操操作作;另另一一个个类类是是RandomAccessFileRandomAccessFile类类,用用来来支支持持随随机机文文件件的操作的操作。117.3.1 7.3.1 文件的创建与管理文件的创建与管理 1. 1. 创建创建FileFile对象对象 JavaJava提供了三种创建提供了三种创建FileFile对象的方法:对象的方法: File File fileObjectfileObject=new File(c:/jdk1.

10、2/File.java);=new File(c:/jdk1.2/File.java); File File dirObjectdirObject=new File(c:/jdk1.2/src/java);=new File(c:/jdk1.2/src/java); = File File fileObjectfileObject=new =new File(c:/jdk1.2/io,File.java) ; File(c:/jdk1.2/io,File.java) ; = File File dirObjectdirObject=new File(c:/jdk1.2/src/java/io)

11、;=new File(c:/jdk1.2/src/java/io); File File fileObjectfileObject=new =new File(dirObject,File.javaFile(dirObject,File.java););122. 2. 检测检测FileFile对象对象FileFile类提供了一整套应用于类提供了一整套应用于FileFile对象的成员方法。对象的成员方法。 exists()exists() 检测检测FileFile对象所描述的文件或目录是否存在对象所描述的文件或目录是否存在。isDirectoryisDirectory()() 检测检测FileF

12、ile对象所描述的是否为目录。对象所描述的是否为目录。isFileisFile()() 检测检测FileFile对象所描述的是否为文件。对象所描述的是否为文件。isHiddenisHidden()() 检测检测FileFile对象所描述的是否为一个隐含文件。对象所描述的是否为一个隐含文件。canReadcanRead()() 检测检测FileFile对象所描述的文件是否可读。对象所描述的文件是否可读。canWritecanWrite()() 检测检测FileFile对象所描述的文件是否可写。对象所描述的文件是否可写。equals(Object equals(Object objobj) ) 检

13、测检测FileFile对象描述的绝对路径与对象描述的绝对路径与objobj的绝对路径是否相等。的绝对路径是否相等。13importjava.io.*;publicclassTryFilepublicstaticvoidmain(Stringargs)FiledirObject=newFile(d:/java_class/java/io);System.out.println(dirObject+(dirObject.isDirectory()?is:isnot)+adirectory.);FilefileObject=newFile(dirObject,“File.java”);System.

14、out.println(fileObject+(fileObject.exists()?does:doesnot)+exist);System.out.println(Youcan+(fileObject.canRead()?:not)+read+fileObject);System.out.println(Youcan+(fileObject.canWrite()?:not)+write+fileObject);143. 3. 访问访问FileFile对象对象在在FileFile类中,提供了一些获取文件信息的成员方法。类中,提供了一些获取文件信息的成员方法。 getNamegetName()

15、() 以以StringString形式返回形式返回FileFile对象描述的文件名。对象描述的文件名。getPathgetPath()() 以以StringString形式返回形式返回FileFile对象描述的路径。对象描述的路径。getAbsolutePathgetAbsolutePath()() 以以StringString形式返回绝对路径。形式返回绝对路径。getParentgetParent()() 以以StringString形式返回父目录名。形式返回父目录名。list()list() 返回目录中包含的全部文件名或目录名。返回目录中包含的全部文件名或目录名。 如果目录为空,则数组也为

16、空。如果目录为空,则数组也为空。length()length() 以以longlong类型的形式返回当前文件所类型的形式返回当前文件所 占有的字节数目。占有的字节数目。lastModifiedlastModified()() 以以longlong类型的形式返回类型的形式返回FileFile对象对象 描述的文件或目录最后一次被修改的时间。描述的文件或目录最后一次被修改的时间。154. 4. 修改修改FileFile对象对象 除了前面介绍的创建除了前面介绍的创建FileFile对象、检测对象、检测FileFile对象和访对象和访问问FileFile对象的操作外,对象的操作外,FileFile类还提

17、供了一些用来修类还提供了一些用来修改改FileFile对象的成员方法。对象的成员方法。 renameTo(FilerenameTo(File path) path) 将将FileFile对象的文件路径改为对象的文件路径改为pathpath。 setReadOnlysetReadOnly()() 将将FileFile对象设置为只读。对象设置为只读。 mkdirmkdir()() 将创建由将创建由FileFile对象指定的目录。对象指定的目录。 mkdirsmkdirs()() 将创建由将创建由FileFile对象指定的目录。对象指定的目录。 createNewFilecreateNewFile(

18、)() 创建创建FileFile对象指定的新文件。对象指定的新文件。 delete()delete() 删除删除FileFile对象描述的文件或目录。对象描述的文件或目录。167.3.2 7.3.2 顺序文件的读取顺序文件的读取 1. 1. 写文件写文件 (1 1)利用)利用FileOutputStreamFileOutputStream写文件写文件 FileOutputStreamFileOutputStream是是OutputStreamOutputStream的子类,它继承了的子类,它继承了OutputStreamOutputStream类的所有成员方法,实现了抽象方法类的所有成员方法,

19、实现了抽象方法writewrite()(),并将流的数据目标定义为磁盘文件。并将流的数据目标定义为磁盘文件。 利用构造方法可以将一个磁盘文件与输出流建立连接,利用构造方法可以将一个磁盘文件与输出流建立连接,以便利用以便利用FileOutputStreamFileOutputStream从从OutputStreamOutputStream继承的有继承的有关成员方法向磁盘文件写入数据。关成员方法向磁盘文件写入数据。 17importjava.io.*;publicclassTryWriteFilepublicstaticvoidmain(Stringargs)byteinfo=12,34,56,7

20、6,89,54,28,90;StringdirName=d:/test;StringfileName=test;tryFiledirObject=newFile(dirName);/创建目录路径对象创建目录路径对象if(!dirObject.exists()dirObject.mkdir();/检测目录是否存在检测目录是否存在FilefileObject=newFile(dirObject,fileName);/创建文件对象创建文件对象fileObject.createNewFile();/创建空文件创建空文件FileOutputStreamoutputFile=newFileOutputSt

21、ream(fileObject);for(inti=0;iinfo.length;i+)outputFile.write(infoi);/写数据写数据outputFile.close();/关闭文件关闭文件catch(IOExceptione)System.out.println(IOException+e+occurred.);18 FilterOutputStreamFilterOutputStream是所有过滤输出流类的父是所有过滤输出流类的父类。在这个类中,重写了类。在这个类中,重写了OutputStreamOutputStream类中的类中的全部成员方法,增强了数据处理的能力。同时全

22、部成员方法,增强了数据处理的能力。同时它还含有若干个子类,其中它还含有若干个子类,其中DataOutputStreamDataOutputStream应用的比较广泛,利用它可以将基本数据类型应用的比较广泛,利用它可以将基本数据类型的数据直接写入输出流。的数据直接写入输出流。 (2 2)利用)利用DataOutputStreamDataOutputStream 写文件写文件19DataOutputStramDataOutputStram类定义的新成员方法类定义的新成员方法 writeByte(int value)writeBoolean(boolean value)writeChar(int v

23、alue)writeShort(int value)writeInt(int value)writeLong(long value)writeFloat(float value)writeDouble(double value)writeChars(String s)20publicclassTryDataStreampublicstaticvoidmain(Stringargs) intintArray=10,20,30,40,50,60;floatfloatArray=11.0f,22.0f,33.0f,44.0f,55.0f;StringdirName=d:/MyData;tryFile

24、dir=newFile(dirName);/创建目录路径对象创建目录路径对象if(!dir.exists()dir.mkdir();/检测目录是否存在检测目录是否存在elseif(!dir.isDirectory()System.out.println(dirName+isnotadirectory.);return;FileaFile=newFile(dir,data.txt);/创建文件对象创建文件对象aFile.createNewFile();/创建空文件创建空文件DataOutputStreammyStream=newDataOutputStream(newFileOutputStre

25、am(aFile);for(inti=0;iintArray.length;i+)myStream.writeInt(intArrayi);for(inti=0;ifloatArray.length;i+)myStream.writeFloat(floatArrayi);catch(IOExceptione)System.out.println(IOexceptionthrown:+e);21 利用利用DataOutputStreamDataOutputStream可以将各种基本数据类型可以将各种基本数据类型和和StringString类对象的内容写入文件,但不能处理一类对象的内容写入文件,但

26、不能处理一般的类对象,为此般的类对象,为此OutputStreamOutputStream类还提供了一个类还提供了一个子类子类ObjectOutputStreamObjectOutputStream可以实现将对象写入文可以实现将对象写入文件的功能。其操作过程为:首先创建一个件的功能。其操作过程为:首先创建一个ObjectOutpurStreamObjectOutpurStream对象,并将一个对象,并将一个FileOutputStreamFileOutputStream对象作为参数传递给对象作为参数传递给ObjectOutpurStreamObjectOutpurStream的构造方法,然后调

27、用的构造方法,然后调用writeObject(ObjectwriteObject(Object objobj) )成员方法将通过参数成员方法将通过参数传入的对象内容写入文件。传入的对象内容写入文件。 (3 3)利用)利用ObjectOutputStreamObjectOutputStream将对象写入文件将对象写入文件222. 2. 读文件读文件 (1) (1) 利用利用FileInputStreamFileInputStream读文件读文件 正像正像FileOutStreamFileOutStream是是OutputStreamOutputStream的子类的子类一样,一样,FileInpu

28、tStreamFileInputStream是是InputStreamInputStream的子的子类,它继承了类,它继承了InputStreamInputStream类的所有成员方类的所有成员方法,实现了抽象方法法,实现了抽象方法read()read(),并将流的数据并将流的数据源定义为文件。源定义为文件。 23publicclassTryReadFilepublicstaticvoidmain(Stringargs)byteinfo=newbyte8;StringdirName=d:/test;StringfileName=test;tryFiledirObject=newFile(dir

29、Name);/创建目录对象创建目录对象FilefileObject=newFile(dirObject,fileName);/创建文件对象创建文件对象FileInputStreaminputFile=newFileInputStream(fileObject);inputFile.read(info);/读文件读文件inputFile.close();/关闭文件关闭文件catch(FileNotFoundExceptione)System.out.println(FileNotFoundException+e+occured.);catch(IOExceptione)System.out.pr

30、intln(IOException+e+occured.);for(inti=0;iinfo.length;i+)System.out.print(infoi+);24 FilterInputStreamFilterInputStream是所有过滤输入流类的父是所有过滤输入流类的父类。在这个类中,重写了类。在这个类中,重写了InputStreamInputStream类中的类中的全部成员方法,增强了读取数据的能力。其中全部成员方法,增强了读取数据的能力。其中DataInputStreamDataInputStream能够直接从输入流中读取基能够直接从输入流中读取基本数据类型和本数据类型和Str

31、ingString类对象的数据。在这个类类对象的数据。在这个类中,有一套与中,有一套与DataOutputStreamDataOutputStream对应的成员方对应的成员方法,利用它们可以根据不同的基本数据类型,法,利用它们可以根据不同的基本数据类型,一次读取若干个字节的内容。一次读取若干个字节的内容。 (2) (2) 利用利用DataInputStreamDataInputStream 写文件写文件25publicclassTryDataStreamInpublicstaticvoidmain(Stringargs)intintArray=newint6;floatfloatArray=n

32、ewfloat5;StringdirName=d:/MyData;tryFiledir=newFile(dirName);/创建目录对象创建目录对象FileaFile=newFile(dir,data.txt);/创建文件对象创建文件对象DataInputStreammyStream=newDataInputStream(newFileInputStream(aFile);for(inti=0;iintArray.length;i+)intArrayi=myStream.readInt();System.out.println(intArrayi);for(inti=0;ifloatArray

33、.length;i+)floatArrayi=myStream.readFloat();System.out.println(floatArrayi);catch(FileNotFoundExceptione)System.out.println(FileNotFoundException+e+occured.);catch(IOExceptione)System.out.println(IOexceptionthrown:+e);26 利用利用DataInputStreamDataInputStream可以直接读取存储在文可以直接读取存储在文件中的对象内容。与将对象写入文件的过程类件中的对象

34、内容。与将对象写入文件的过程类似,从文件中读回对象,首先需要创建一个似,从文件中读回对象,首先需要创建一个ObjectInputStreamObjectInputStream对象,然后调用成员方法对象,然后调用成员方法readObjectreadObject()(),返回一个返回一个ObjectObject类型的对象,最后根据需类型的对象,最后根据需要将其转换成相应的类。要将其转换成相应的类。 (3) (3) 利用利用ObjectInputStreamObjectInputStream读取文件中的对象内容读取文件中的对象内容277.4 7.4 字符流字符流 在在 JavaJava语语 言言 中

35、中 , 提提 供供 了了 字字 符符 输输 出出 流流WriterWriter和和字字符符输输入入流流ReaderReader。由由于于JavaJava采采用用的的是是UnicodeUnicode编编码码,每每个个字字符符占占1616个个二二进进制制位位,即即两两个个字字节节,所所以以每每次次读读写写操操作作以以两两个个字字节节为为单单位位。不不仅仅如如此此,在在读读取取的的过过程程中中,还还要要承承担担在在UnicodeUnicode编编码码与本地机器编码之间的转换。与本地机器编码之间的转换。28 在在JavaJava语言中,语言中,WriterWriter是一个抽象类,它是所有以字是一个抽

36、象类,它是所有以字符为单位的输出流的父类,其中定义了字符输出流在符为单位的输出流的父类,其中定义了字符输出流在实现写流操作时需要的大部分成员方法,为向输出流实现写流操作时需要的大部分成员方法,为向输出流写入字符提供了方便。写入字符提供了方便。 write(intwrite(int c) c) write(char write(char cbufcbuf) write(char write(char cbufcbuf, , intint off, off, intint lenlen) ) write(String write(String strstr) ) write(String writ

37、e(String strstr, , intint off, off, intint lenlen) ) 1 1字符输出流字符输出流29 与与WriterWriter对应,对应,ReaderReader也是一个抽象类,它是也是一个抽象类,它是所有以字符为单位的输入流的父类,同样也定所有以字符为单位的输入流的父类,同样也定义了字符输入流在实现读流操作时需要的大部义了字符输入流在实现读流操作时需要的大部分成员方法。分成员方法。 read()read() read(char read(char cbufcbuf) read(char read(char cbufcbuf, , intint off,

38、 off, intint lenlen) ) skip(long n)skip(long n) ready()ready() close()close() 2 2字符输入流字符输入流307.5 对象的串行化 所所谓谓串串行行化化是是指指在在外外部部永永久久性性文文件件中中存存放放或或检检索索对对象象的的过过程程。将将对对象象写写入入文文件件被被称称为为串串行行化化对对象象,从从文文件件中中读读取取对对象象被被称称为为并并行行化化对对象象。如如果果一一个个对对象象具具有有串串行行化化能能力力,那那么么将将这这个个对对象象的的内内容容永永久久地地保保存存或或从从永永久久性性的的文文件件中中读读取取

39、出出来来都将是一件很容易的事情。都将是一件很容易的事情。31 在在JavaJava语语言言,若若要要使使对对象象具具有有串串行行化化能能力力,只只需需要要让让对对象象所所属属的的类类实实现现SerializableSerializable接接口口即即可可。实实际际上上,在在SerializableSerializable接接口口中中,没没有有声声明明任任何何内内容容,因因此此在在实实现现该接口的类中也没有任何接口方法需要实现。该接口的类中也没有任何接口方法需要实现。 OutputStreamOutputStream类类有有一一个个子子类类ObjectOutputStreamObjectOutp

40、utStream,利利用用这这个个类类提提供供的的writeObject(ObjectwriteObject(Object objobj ) )成成员员方方法法可可以以实实现现将将任任何何实实现现了了SerializableSerializable接接口口的的类类对对象象写写入入永永久久性文件中的功能。性文件中的功能。 32FileOutputStream output= new FileOutputStream(MyFile);ObjectOutputStream objectOut= new ObjectOutputStream(output);objectOut.writeObject(

41、MyObject);33MyClassMuObject;tryFileInputStreaminput=newFileInputStream(MyFile);ObjectInputStreamobjectIn=newObjectInputStream(input);MyObject=(MyClass)objectIn.readObject();catch(IOExceptione)System.out.println(e);catch(ClassNotFoundExceptione)System.out.println(e);34classEmployeeimplementsSerializa

42、bleprivateStringname;/姓名姓名privatedoublesalary;/工资工资privateDatehireDay;/开始受雇日期开始受雇日期publicEmployee(Stringn,doubles,Dated)name=n;salary=s;hireDay=d;publicEmployee()publicStringtoString()returnname+salary+hireYear();publicvoidraiseSalary(doublebyPercent)salary*=1+byPercent/100;publicinthireYear()return

43、hireDay.getYear();35publicclassObjectFileTestpublicstaticvoidmain(Stringargs)tryEmployeestaff=newEmployee3;staff0=newEmployee(HarryHacker,35000,newDate(1989,10,1);staff1=newEmployee(CarlCracker,75000,newDate(1987,12,15);staff2=newEmployee(TonyTester,38000,newDate(1990,3,15);ObjectOutputStreamout=new

44、ObjectOutputStream(newFileOutputStream(employee.dat);out.writeObject(staff);out.close();ObjectInputStreamin=newObjectInputStream(newFileInputStream(employee.dat);EmployeenewStaff=(Employee)in.readObject();inti;for(i=0;inewStaff.length;i+)newStaffi.raiseSalary(100);for(i=0;inewStaff.length;i+)System.out.println(newStaffi);catch(Exceptione)System.out.print(Error:+e);System.exit(1);36

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号