第18次第6章流式输入输出及文件处理_第1页
第18次第6章流式输入输出及文件处理_第2页
第18次第6章流式输入输出及文件处理_第3页
第18次第6章流式输入输出及文件处理_第4页
第18次第6章流式输入输出及文件处理_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第第 6 章章流式输入输出及文件处理流式输入输出及文件处理第6章 流式输入输出及文件处理流式输入输出及文件处理l6.1 流式输入输出处理机制l6.2 Java的输入输出流库l6.3 文件l6.4 字符流l6.5 对象的串行化26.3.2 顺序文件的读写l字节流的输入输出(文件)写l利用FileOutputStream写文件l利用DataOutputStream写文件l利用ObjectOutputStream写文件读l利用FileInputStream读文件l利用DataInputStream读文件l利用ObjectInputStream读文件l6.3.3 随机文件的访问3类的层次结构图类的层

2、次结构图4OutputStreamOutputStream FileOutFileOutputputStreamStream FilterOFilterOututputStreamputStream ObjectOutputStreamObjectOutputStream DataOutputStreamDataOutputStream . 类层次结构举例类层次结构举例返回5InInputStreamputStream FileFileInInputputStreamStream FilterFilterInInputStreamputStream ObjectObjectInInputStr

3、eamputStream DataDataInInputStreamputStream . 类层次结构举例类层次结构举例返回补充:文件输入输出流程 在在JavaJava中中IOIO操作也是有相应步骤的,以操作也是有相应步骤的,以文件操作为例,主要的操作流程如下:文件操作为例,主要的操作流程如下:1.1.使用使用FileFile类创建类创建一个要操作的文件对象;(也可一个要操作的文件对象;(也可以省略)以省略)2.2.创建输入流或输出流对象,并指定操作文件;创建输入流或输出流对象,并指定操作文件;3.3.进行进行读读/ /写操作写操作4.4.关闭关闭输入输入/ /输出(也可以省略)输出(也可以省

4、略)676.3.2 6.3.2 顺序文件的读取顺序文件的读取 1. 1. 写文件写文件 (1 1)利用)利用FileOutputStreamFileOutputStream写文件写文件FileOutputStreamFileOutputStream是是OutputStreamOutputStream的子类,它继承了的子类,它继承了OutputStreamOutputStream类的所有成员方法,类的所有成员方法,实现了抽象方法实现了抽象方法writewrite()() 。创建创建FileOutputStreamFileOutputStream的对象,就是创建一个文件输出流对的对象,就是创建一个

5、文件输出流对象,而建立输出流需要指定传输的象,而建立输出流需要指定传输的 “ “目标目标”,该流的数据目,该流的数据目标定义标定义为为“磁盘文件磁盘文件” 。因此因此FileOutputStreamFileOutputStream 的构造方法参数为的构造方法参数为“文件对象文件对象”。例:。例:FileOutputStream outputFile=new FileOutputStream(fileObject);8import java.io.*; / 利用利用FileOutputStreamFileOutputStream写写文件举例文件举例public class TryWriteFil

6、e public static void main(String args) byte info=12,34,56,76,89,54,28,90; String dirName=d:/test; String fileName=test.txt; try File dirObject=new File(dirName); /创建目录路径对象创建目录路径对象 if (!dirObject.exists() dirObject.mkdir(); /检测目录是否存在检测目录是否存在 File fileObject=new File(dirObject,fileName); /创建文件对象创建文件对象

7、 fileObject.createNewFile(); /创建空文创建空文件件 FileOutputStream outputFile=new FileOutputStream(fileObject); for (int i=0;iinfo.length;i+) outputFile.write(infoi);/写数据写数据 outputFile.close(); /关闭文件关闭文件 catch (IOException e) System.out.println(IOException+e+ occurred.); FileOutputStream用来将字节型(用来将字节型(Byte)数据

8、直接写入文件,但文件中数据不能直接查看。)数据直接写入文件,但文件中数据不能直接查看。outputFile.write(info);/write的参数是数据源,数组名的参数是数据源,数组名(“d:/test/ test.txt”);96.3.2 6.3.2 顺序文件的读取顺序文件的读取 2. 2. 读文件读文件 (1 1)利用利用FileInputStreamFileInputStream读文件读文件FileInputStreamFileInputStream是是InputStreamInputStream的子类,它的子类,它继承继承了了InputStreamInputStream类的所有成员

9、方法,类的所有成员方法,实现了实现了抽象方法抽象方法read()read() 。创建创建FileInputStreamFileInputStream的对象的对象,就是创建一个文件输入流对象,就是创建一个文件输入流对象,输入流的目标是程序,而输入流的目标是程序,而 “ “源源”是是“磁盘文件磁盘文件”,因此在因此在构构造输入流对象的时候需要指定要读取的数据所在的文件名造输入流对象的时候需要指定要读取的数据所在的文件名 。该文件名作该文件名作为为FileInputStream FileInputStream 的构造方法的参数的构造方法的参数。例:。例: FileInputStream inputF

10、ile=new FileInputStream(fileObject);10public class TryReadFile/ 利用利用FileInputStreamFileInputStream读文件举例读文件举例public static void main(String args) byte info=new byte8; try FileInputStream inputFile=new FileInputStream(“d:/test/test.txt”); inputFile.read(info); /读文件读文件 inputFile.close(); /关闭关闭文件输入流文件输入

11、流 catch(FileNotFoundException e) System.out.println(FileNotFoundException+e+ occured.); catch (IOException e) System.out.println(IOException +e+ occured.); for (int i=0;iinfo.length;i+) System.out.print(infoi+ );创建文件输入流对象创建文件输入流对象利用利用FileInputStreamFileInputStream读文件练习读文件练习import java.io.*;public cl

12、ass Example6_6read public static void main(String args) byte b=new byte255; try FileInputStream in=new FileInputStream(d:/Java/hello.txt); in.read(b); String s=new String(b); System.out.println(s);/ for(byte i:b) System.out.println(i);/?是否正确? catch(IOException e) System.out.println(Error +e); 11创建一个

13、创建一个名名为为inin的的文件输入流文件输入流对象,源文件是对象,源文件是” ” d:/Java/hello.txt”d:/Java/hello.txt”将文件中的数据读入到数组将文件中的数据读入到数组b b中中注意:如果写入文本的byte数组是由string数据转换得到的,那么读取之后byte数组也要转换成String,才可以在程序中正常输出。文件输入输出流 应用小结 (FileInputStream/FileOutputStream)1.1.要读或写的数据都需要使用要读或写的数据都需要使用bytebyte类型的数组类型的数组存储;存储;2.2.如果直接将如果直接将bytebyte数组中存

14、储的整数存入文件,由数组中存储的整数存入文件,由于编码方式不同,导致打开文件后是于编码方式不同,导致打开文件后是乱码乱码;但如果;但如果数据事先以数据事先以字符串的形式字符串的形式表示,再通过表示,再通过调用调用getBytesgetBytes()()转换成转换成bytebyte数组,再写入文件,就可以数组,再写入文件,就可以正常显示;读的过程相反,需要将正常显示;读的过程相反,需要将bytebyte数组转换为数组转换为字符串字符串;12文件输入输出流 应用小结 (FileInputStream/FileOutputStream)3.3.要向文件要向文件写写入数据,对应的是入数据,对应的是输出

15、输出操作,使用操作,使用FileOutputStreamFileOutputStream;要从文件;要从文件读取读取数据到程序,对应的是数据到程序,对应的是输输入入操作,操作,使用使用FileInputStreamFileInputStream;它们的;它们的构造方法构造方法都有都有4 4种种(175175),参数既可以是,参数既可以是FileFile对象,也可以是表示文件的相对象,也可以是表示文件的相对路径或绝对路径的字符串(这种形式更好用)对路径或绝对路径的字符串(这种形式更好用)4.4.写写数据时,需要使用数据时,需要使用FileOutputStreamFileOutputStream的

16、对象调用的对象调用write(),write(),参数参数为要写入的数据所在的为要写入的数据所在的字节数组字节数组名;名;读读数据时,数据时,需要需要使用使用FileInputStreamFileInputStream的对象调用的对象调用read()read(),参数为要存,参数为要存储数据的储数据的字节数组字节数组名。名。13l缺点:虽然可以对整形数、字符及字符串进行输缺点:虽然可以对整形数、字符及字符串进行输入、输出,但入、输出,但不便于对浮点数或布尔类型的数据不便于对浮点数或布尔类型的数据直接进行操作直接进行操作。lDataOutputStream/DataInputStream可以直接

17、可以直接操作各种不同类型的数据。操作各种不同类型的数据。14文件输入输出流 应用小结 (FileInputStream/FileOutputStream)6.3.2 顺序文件的读写l字节流的输入输出(文件)写l利用FileOutputStream写文件l利用DataOutputStream写文件l利用ObjectOutputStream写文件读l利用FileInputStream读文件l利用DataInputStream读文件l利用ObjectInputStream读文件l6.3.3 随机文件的访问15类的层次结构图类的层次结构图)!=!)16public class TryDataStrea

18、m public static void main(String args) int intArray=10,20,30,40,50,60; float floatArray=11.0f,22.0f,33.0f,44.0f,55.0f; try DataOutputStream myStream= new DataOutputStream(new FileOutputStream(“data.txt”); for (int i=0;iintArray.length;i+) myStream.writeInt(intArrayi); for(int i=0;ifloatArray.length;

19、i+) myStream.writeFloat(floatArrayi); catch(IOException e)System.out.println(IO exception thrown: +e); /构造方法详见构造方法详见P176(2 2)利用)利用DataOutputStreamDataOutputStream 写写文件文件举例举例DataOutputStreamDataOutputStream流的流的一端需要连接在一端需要连接在FileOutputStreamFileOutputStream流对流对象上象上17DataOutputStramDataOutputStram类定义的新

20、成员方法类定义的新成员方法 writeByte(int value)writeBoolean(boolean value)writeChar(int value)writeShort(int value)writeInt(int value)writeLong(long value)writeFloat(float value)writeDouble(double value)writeChars(String s)每个方法与相应的数据类型对应。(2 2)利用)利用DataOutputStreamDataOutputStream 写写文件文件练习练习l将一个字符串写入到文件。import ja

21、va.io.*;public class DataOutputStreamString public static void main(String args) String s=Hello!; try/创建一个DataOutputStream的对象ds,用来将数据写入“Hello.txt” DataOutputStream ds=new DataOutputStream(new FileOutputStream(Hello.txt); ds.writeChars(s);/将s写入文件 catch(IOException e) System.out.println(IO exception t

22、hrown: + e); 1819public class TryDataStreamIn/利用利用DataInputStreamDataInputStream读文件读文件举例举例public static void main(String args) int intArray=new int6; float floatArray=new float5; String dirName=d:/MyData; try File dir=new File(dirName); /创建目录对象创建目录对象 File aFile=new File(dir,data.txt); /创建文件对象创建文件对象

23、DataInputStream myStream=new DataInputStream(new FileInputStream(aFile); for (int i=0;iintArray.length;i+) intArrayi=myStream.readInt(); System.out.println(intArrayi); for (int i=0;ifloatArray.length;i+) floatArrayi= myStream.readFloat(); System.out.println(floatArrayi); catch(FileNotFoundException

24、e) System.out.println(FileNotFoundException+e+ occured.); catch(IOException e) System.out.println(IO exception thrown: +e); DataInputStreamDataInputStream流的一端需要连接流的一端需要连接在在FileInputStreamFileInputStream流对象上流对象上Netbeans写20DataInputStramDataInputStram类定义的新成员方法类定义的新成员方法 readByte()readBoolean()readChar(

25、)readShort()readInt()readLong()readFloat()readDouble()每个方法用于读取相应数据类型的数据。注意: 与FileOutputStream中read()的区别:DataInputStream读取数据的方法都没有参数,并且每个方法都只能读取一个数据。练习public class DataInputStreamString public static void main(String args) try DataInputStream rs=new DataInputStream(new FileInputStream(Hello.txt); cha

26、r c=new char255; for(int i=0;(ci=rs.readChar()!=-1;i+) ;/ c=rs.readChars();/能否将文件中数据一次性读到字符数组? System.out.println(ci); catch(IOException e) System.out.println(IO exception thrown: + e); 21创建一个名为创建一个名为rsrs的数据输入流的数据输入流对象,源文件是对象,源文件是” ” Hello.txtHello.txt”将文件中的数据读入到数组将文件中的数据读入到数组c c中中22DataOutputStream

27、DataOutputStream就就是是FilterFilterOutOutputStreamputStream的子的子类。类。DataDataOutOutputStreamputStream可以将文本文件中可以将文本文件中基本基本数据类型数据类型的数据的数据直接写入直接写入程序程序。注意:注意:DataDataOutOutputStreamputStream流的流的一端需要一端需要连接在连接在FileFileOutOutputStreamputStream流对象上流对象上。例如:。例如:(2 2)利用)利用DataOutputStreamDataOutputStream 写写文件文件 应用应

28、用小结小结DataOutputStream myStream=new DataOutputStream(new FileOutputStream(aFile);l缺点:利用缺点:利用DataOutputStreamDataOutputStream可以将各种基本数据可以将各种基本数据类型和类型和StringString类对象的内容写入文件,但不能处理类对象的内容写入文件,但不能处理一般的类对象一般的类对象。l为此为此OutputStreamOutputStream类还提供了一个子类类还提供了一个子类ObjectOutputStreamObjectOutputStream可以实现将对象写入文件的功

29、可以实现将对象写入文件的功能。能。23(2 2)利用利用DataInputStream DataInputStream 写写文件文件 应用小结应用小结6.3.2 顺序文件的读写l字节流的输入输出(文件)写l利用FileOutputStream写文件l利用DataOutputStream写文件l利用ObjectOutputStream写文件读l利用FileInputStream读文件l利用DataInputStream读文件l利用ObjectInputStream读文件l6.3.3 随机文件的访问24类的层次结构图类的层次结构图25其其操作过程为:首先创建一个操作过程为:首先创建一个Object

30、OutpurStreamObjectOutpurStream对对象,并将一个象,并将一个FileOutputStreamFileOutputStream对象作为参数传递给对象作为参数传递给ObjectOutpurStreamObjectOutpurStream的构造方法,然后调用的构造方法,然后调用writeObjectwriteObject(Object (Object objobj) )成员方法将通过参数传入成员方法将通过参数传入的对象内容写入文件。的对象内容写入文件。 (3 3)利用)利用ObjectOutputStreamObjectOutputStream将对象写入文件将对象写入文件

31、P1786.3.3 随机文件的访问lJava中提供了RandomAccessFile类描述随机文件,所谓随机就是可以随机定位想要读的文件内容的指针位置。l它有两个构造方法public RandomAccessFile(String name,String mode)public RandomAccessFile(File name,String mode)l其中:第一个参数name表示磁盘文件表示磁盘文件,要求必须存在,否则抛输入输出异常。第二个参数mode表示存取方式表示存取方式,只读只读文件用r表示,读写读写文件用rw表示,26Netbeans276.4 6.4 字符流字符流在在JavaJ

32、ava语言中,提供了字符输出流语言中,提供了字符输出流WriterWriter和字符输入流和字符输入流ReaderReader。由于由于JavaJava采用的是采用的是UnicodeUnicode编码,每个字符占编码,每个字符占1616个二进制位,个二进制位,即两个字节,所以每次读写操作以两个字节为单位即两个字节,所以每次读写操作以两个字节为单位。WriterWriter的子类:的子类:P183P183图图6-16-1,补充:,补充:FileWriterFileWriter类,修改:类,修改:FilteredWriterFilteredWriter为为FilterWriterFilterWri

33、terReaderReader的的子类:子类:P185P185图图6-26-2,补充:补充:FileReaderFileReader类,修改:类,修改:FilteredFilteredReadReaderer为为FilterReaderFilterReader,OutputStreamReaderOutputStreamReader改改为为InputStreamReaderInputStreamReaderNetbeans28 在在JavaJava语言中,语言中,WriterWriter是一个抽象类,它是所有以字是一个抽象类,它是所有以字符为单位的输出流的父类,其中定义了字符输出流在符为单位的

34、输出流的父类,其中定义了字符输出流在实现写流操作时需要的大部分成员方法,为向输出流实现写流操作时需要的大部分成员方法,为向输出流写入字符提供了方便。写入字符提供了方便。 write(int write(int c)c) write(char write(char cbufcbuf) write(char write(char cbufcbuf, , int int offoff, , int int lenlen) ) write(String write(String strstr) ) write(String write(String strstr, , int int offoff,

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

36、g n)skip(long n) ready()ready() close()close() 2 2字符输入流字符输入流306.5 对象的串行化所谓所谓串行化串行化是指在外部永久性文件中是指在外部永久性文件中存放存放或检索对象或检索对象的过程的过程。将将对象写入文件被称为对象写入文件被称为串行化对象串行化对象,从文从文件中读取对象被称为件中读取对象被称为并行化对象并行化对象。如果要对象如果要对象的内容永久地保存或从永久性的内容永久地保存或从永久性的文件中读取的文件中读取出来,那就要这个出来,那就要这个对象具有对象具有串行化串行化能力。能力。31在在JavaJava语言,语言,若要使对象具有串行

37、化能力若要使对象具有串行化能力,只需要让,只需要让对对象所属的类实现象所属的类实现SerializableSerializable接口接口即可。实际上,在即可。实际上,在SerializableSerializable接口中,没有声明任何内容接口中,没有声明任何内容,因此在实现,因此在实现该接口的类中也没有任何接口方法需要实现该接口的类中也没有任何接口方法需要实现。将 对 象将 对 象 写 入 到 文 件 时 , 需 要 创 建写 入 到 文 件 时 , 需 要 创 建 对 象 输 出 流对 象 输 出 流(ObjectOutputStreamObjectOutputStream,它是,它是O

38、utputStreamOutputStream类的子类的子类)类)的对象,利用这个类提供的的对象,利用这个类提供的writeObjectwriteObject(Object (Object objobj ) )成员方法成员方法可以将可以将任何任何实现了实现了SerializableSerializable接口的类对象接口的类对象写入永久性文件中的功能。写入永久性文件中的功能。 6.5 对象的串行化import java.util.*;import java.io.*;public class Employee implements Serializable private String nam

39、e; /姓名 private double salary; /工资 private Date hireDay; /开始受雇日期 public Employee(String n, double s, Date d) name = n; salary = s; hireDay = d; public Employee() /省略成员方法,详见P189326.5 对象的串行化举例33public class ObjectFileTest public static void main(String args) try Employee staff = new Employee3; staff0 =

40、 new Employee(Harry Hacker, 35000, new Date(1989,10,1); staff1 = new Employee(Carl Cracker, 75000, new Date(1987,12,15); staff2 = new Employee(Tony Tester, 38000,new Date(1990,3,15); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(employee.dat); out.writeObject(staff); out.close(); ObjectInputStre

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论