第8章 文件、流和输入输出技术_第1页
第8章 文件、流和输入输出技术_第2页
第8章 文件、流和输入输出技术_第3页
第8章 文件、流和输入输出技术_第4页
第8章 文件、流和输入输出技术_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

第8章文件、流和输入输出技术,2,主要内容,8.1I/O流概述什么是流8.2I/O流类I/O流的层次:字符流、字节流、标准输入/输出流8.3过滤流与流的串接8.4文件流类与文件操作8.5对象串行化作业,3,8.1I/O流概述,输入/输出处理是程序设计中非常重要的一部分,比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。Java把这些不同类型的输入、输出源抽象为流(stream),用统一接口来表示,从而使程序简单明了。Jdk提供了包java.io,其中包括一系列的类来实现输入/输出处理。进行I/O操作时可能会产生I/O例外,属于非运行时例外,应该在程序中处理。如:FileNotFoundException,EOFException,IOException,4,什么是流,流实际上是一个数据序列。采用流的机制可以使数据有序地输入和输出。输入流与输出流。,5,8.2I/O流类,Java有各种各样的执行I/O的流,在java.io包中定义了这些流,其层次结构图如图8.3所示。编写程序时,java.io包必须被执行输入输出的程序导入。输入输出流可以从以下几个方面进行分类:从流的方向划分:输入流和输出流;从流的分工划分:节点流和处理流;从流的内容划分:字符流和字节流。,6,I/O流类,7,8.2.1字符流,Java中的字符使用的是Unicode编码,每个字符占有两个字节,即16bit。字符流是以16位的Unicode码表示的字符为基本处理单位,进行文本数据的读写,可以实现Java程序中的内部格式和文本文件、显示输出、键盘输入等外部格式之间的转换。Reader和Writer是java.io包中所有字符流的抽象基类。提供了输出字符的API及其部分实现。,8,字符流,1.ReaderReader类是处理所有字符流输入类的父类。主要有以下方法:读取字符publicintread()throwsIOException;/*读取一个字符,返回值为读取的字符*/publicintread(charcbuf)throwsIOException;/*读取一系列字符到数组cbuf中,返回值为实际读取的字符的数量*/publicabstractintread(charcbuf,intoff,intlen)throwsIOException;/*读取len个字符,从数组cbuf的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现*/标记流publicbooleanmarkSupported();/*判断当前流是否支持做标记*/publicvoidmark(intreadAheadLimit)throwsIOException;/*给当前流作标记,最多支持readAheadLimit个字符的回溯。*/publicvoidreset()throwsIOException;/*将当前流重置到做标记处*/关闭流publicabstractvoidclose()throwsIOException;,9,字符流,2.WriterReader类是处理所有字符流输出类的父类。主要有以下方法:向输出流写入字符publicvoidwrite(intc)throwsIOException;/将整型值c的低16位写入输出流publicvoidwrite(charcbuf)throwsIOException;/将字符数组cbuf写入输出流publicabstractvoidwrite(charcbuf,intoff,intlen)throwsIOException;/*将字符数组cbuf中的从索引为off的位置处开始的len个字符写入输出流*/publicvoidwrite(Stringstr)throwsIOException;/将字符串str中的字符写入输出流publicvoidwrite(Stringstr,intoff,intlen)throwsIOException;/*将字符串str中从索引off开始处的len个字符写入输出流*/flush()刷空输出流,并输出所有被缓存的字节。关闭流publicabstractvoidclose()throwsIOException;,10,3.Reader与Writer的子类,从Reader(直接子类6个)和Writer(直接子类7个)派生出的一系列类,以16位的Unicode码表示的字符为基本处理单位。InputStreamReaderOutputStreamWriterCharArrayReaderCharArrayWriterPipedReaderPipedWriterFilterReaderFilterWriterBufferedReaderBufferedWriterStringReaderStringWriter-PrintWriter,11,8.2.2字节流,字节流类是从抽象类InputStream和OutputStream派生出来的一系列类。字节(byte)为基本处理单位。1.InputStreamInputStream类直接继承Object类。主要方法如下:从流中读取数据:intread();/读取一个字节,返回值为所读的字节intread(byteb);/读取多个字节,放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际读取的字节的数量intread(byteb,intoff,intlen);/读取len个字节,放置到以下标off开始字节数组b中,返回值为实际读取的字节的数量intavailable();/返回值为流中尚未读取的字节的数量longskip(longn);/读指针跳过n个字节不读,返回值为实际跳过的字节数量关闭流:close();/流操作完毕后必须关闭使用输入流中的标记:voidmark(intreadlimit);/记录当前读指针所在位置,readlimit表示读指针读出readlimit个字节后所标记的指针位置才失效voidreset();/把读指针重新指向用mark方法所记录的位置booleanmarkSupported();/当前的流是否支持读指针的记录功能,12,字节流,2.OutputStream主要方法如下输出数据voidwrite(intb);/往流中写一个字节bvoidwrite(byteb);/往流中写一个字节数组bvoidwrite(byteb,intoff,intlen);/把字节数组b中从下标off开始,长度为len的字节写入流中flush()/刷空输出流,并输出所有被缓存的字节由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。关闭流:close();/流操作完毕后必须关闭,13,字节流,3.Input/OutputStream的子类FileInputStream、FileOutputStreamPipedInputStream、PipedOutputStreamByteArrayInputStream、ByteArrayOutputStreamObjectInputStream、ObjectOutputStreamFilterInputStream、FilterOutputStreamStringBufferInputStreamSequenceInputStream,14,8.2.3标准输入/输出,在Java应用程序开始执行时(也就是当main方法被执行时),Java自动创建3个与设备关联的流对象:System.in、System.out,System.err。System.in对象(标准输入流对象)是InputStream类型的,是连接程序与标准输入设备(通常是键盘)的一个输入流对象,当执行System.in.read()操作时,从键盘得到的信息通过System.in流到了程序中。System.out对象(标准输出流对象)是PrintStream类型的,是连接程序和标准输出设备(通常是显示器)的一个输出流对象,当执行System.out.println()语句时,信息流从程序通过System.out流到了屏幕上。示例:参看例8.1/StreamDemo1.javaimportjava.io.*;publicclassStreamDemo1publicstaticvoidmain(Stringargs)throwsIOExceptionInputStreamReaderin=newInputStreamReader(System.in);charcbuf=newchar50;in.read(cbuf);System.out.println(cbuf);,15,8.3过滤流与流的串接,过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类。作用:给朴素的Input/OutputStream加上一些修饰某些有用的格式,16,过滤流类层次结构,17,过滤流与流的串接,要使用过滤流,首先必须把它串接到某个输入/输出流上,以达到数据转换的目的。通常在构造方法的参数中指定所要连接的流:FilterInputStream(InputStreamin);FilterOutputStream(OutputStreamout);过滤流:BufferedInput/OutputStreamDataInput/OutputStreamLineNumberInputStreamPushBackInputStreamPrintStream,18,过滤流,BufferedInput/OutputStream(带缓冲的过滤流)自动利用内存缓冲,不必每次存取外设还可在其外面再加包装newDataInputStream(newBufferedInputStream(newFileInputStream(“File1.dat”);,19,过滤流,DataInput/OutputStream(数据流)对于基本数据类型进行有格式的读写注意:此处为存储格式,DataOutputStream与DataInputStream配套使用才有意义实现了DataInput接口readUTF/Int/Float/Char/Boolean/Long/Double()readLine()读入的重要方法实现了DataOutput接口writeUTF/Int/Float/Char/Boolean/Long/Double()LineNumberInputStream提供了行控制能力PushBackInputStream提供了超前读入与退回的能力PrintStream提供了将各种原始数据输出为文本的方法,20,8.4文件流类与文件操作,I/O处理中,最常见的是对文件的操作。java.io包中有关文件处理的类有:File、FileDescriptor、FileInputStream、FileOutputStream、RamdomAccessFile和处理字符文件的FileReaderFileWriter;接口有:FilenameFilter。在进行文件操作时,会产生非运行时异常IOException,必须捕获或声明抛弃。,21,文件的操作步骤,对于文件的操作也就是实现对文件的读写,而不管是文本文件还是二进制文件都可采用相同的步骤:1.把一个合适的流连接到文件;2.使用循环读或写数据;3.关闭流。,22,8.4.1File类,File类主要用于获取磁盘中文件或目录的信息。能够创建、删除文件、重命名文件、判断文件的读写权限及是否存在,设置和查询文件的最近修改时间等。File类的实例表示主机文件系统中的文件名或路径名。File类提供4个构造函数。publicFile(Stringname)/*指定与File对象关联的文件或目录的名称,name可以包含路径信息及文件或目录名*/publicFile(StringpathToName,Stringname)/*使用参数pathToName(绝对路径或相对路径)来定位参数name所指定的文件夹或目录*/publicFile(Filedirectory,Stringname)/*使用现有的File对象directory(绝对路径或相对路径)来定位参数name所指定的文件夹或目录*/publicFile(URIuri)/*使用给定的统一资源定位符URI对象来定位文件*/示例:参看例8.2、8.3、8.4,23,8.4.2FileInputStream、FileOutputStream类与读写二进制文件,FileInputStream和FileOutputStream分别是InputStream和OutputStream的子类,用于处理文件字节流,每次一个字节。FileInputStream类用来打开一个输入文件,若文件不存在,则会产生非运行时例外FileNotFoundException,必须捕获或声明抛弃;FileOutputStream类用来打开一个输出文件,若文件不存在,则会创建一个新的文件,否则原文件的内容会被新写入的内容所覆盖。,24,FileInputStream、FileOutputStream类与读写二进制文件,【例8.5】设计一GUI,功能一可按给定的文件名打开二进制文件并显示,功能二能将写好的文本以二进制文件保存。每个二进制文件包含5条记录,每条记录包括3个独立的数据:职员姓名(String类型)、年龄(int类型)和工资(double类型),具体数据随机产生。,分析:由图可看出,GUI的设计比较简单,以JFrame为主窗口,添加一个JTextField组件用于写入文件名,并用一个Jlable进行指示;再加入两个JButton组件用于产生读写文件命令;最后加入一个JTextArea组件用于显示记录。接下来要完成的就是两个子任务:写二进制文件与读二进制文件。,25,1)写二进制文件,分析:第一步:应选择合适的流类与文件相接。由于要写一个二进制文件,首先选用FileOutputStream类,但它能提供的write()方法只能写入int和byte类型数据,而我们需要能够写入String,double和int。能够写入各种不同类型数据的类是DataOutputStream,对于每种基本类型都有一个方法。将DataOutputStream与FileOutputStream串接起来:DataOutputStreamout=newDataOutputStream(newFileOutputStream(filename);这个程序将会向DataOutputStream写入数据,然后DataOutputStream通过FileOutputStream将数据传到文件。Filename是传入的文件名参数。,26,写二进制文件,第二步:使用循环写数据。要随机产生5条记录的具体数据,可使用for循环:for(inti=0;i5;i+)out.writeUTF(Name+i);out.writeInt(int)(20+Math.random()*25);out.writeDouble(500.00+Math.random()*100);用writeInt()方法写入一个int,使用writeDouble()方法写入一个double,使用writeUTF方法写入一个String。第三步:关闭输出流。out.close();完成写二进制文件的子任务代码如下:privatevoidwriteRecords(Stringfilename)tryDataOutputStreamout=newDataOutputStream(newFileOutputStream(filename);for(inti=0;i5;i+)out.writeUTF(=Name+i);out.writeInt(int)(20+Math.random()*25);out.writeDouble(500.00+Math.random()*100);out.close();catch(IOExceptione)display.setText(IOERROR:+e.getMessage()+n);,27,2)读二进制文件,分析:从二进制文件中读数据的步骤是:创建一个输入流并打开文件;读取数据;关闭文件。首先选择FileInputStream类,它可以根据文件名创建文件输入流。对于使用DataOutputStream类的各种write方法所写的数据文件,必须使用DataInputStream类的对应read方法读入。,28,读二进制文件这一子任务可由一方法完成如下:,privatevoidreadRecords(Stringfilename)tryDataInputStreamin=newDataInputStream(newFileInputStream(filename);display.setText(NameAgepayn);trywhile(true)Stringname=in.readUTF();intage=in.readInt();doublepay=in.readDouble();display.append(name+age+pay+n);catch(EOFExceptione)finallyin.close();catch(FileNotFoundExceptione)display.setText(IOERROR:Filenotfound:+filename+n);catch(IOExceptione)display.setText(IOERROR:+e.getMessage()+n);,29,8.4.3RandomAccessFile,类RandomAccessFile允许对文件内容同时完成读和写操作,直接继承object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件操作的方法:readXXX()或writeXXX():如ReadInt(),ReadLine(),WriteChar(),WriteDouble()等。示例:参看例8.6,30,8.4.4FileReader、FileWriter类与读写文本文件,【例8.7】设计一简易文本编辑器,具有打开、保存文本文件的功能。,分析过程类似于二进制文件的读写操作【总结】对于文件的操作也就是实现对文件的读写,而不管是文本文件还是二进制文件都可采用相同的步骤:1.把一个合适的流连接到文件;2.使用循环读或写数据;3.关闭流。,31,8.5对象串行化(Serialization),8.5.1对象流能够输入输出对象的流称为对象流。可以将对象串行化后通过对象输入输出流写入文件或传送到其它地方。在java中,允许可串行化的对象通过对象流进行传输。类ObjectOutputStream和ObjectInputStream分别继承了接口ObjectOutput和ObjectInput,将数据流功能扩展到可以读写对象。,32,对象串行化(Serialization),8.5.2串行化举例要实现一个对象的串行化,可用两个步骤完成:第一步创建可串行化对象;第二

温馨提示

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

评论

0/150

提交评论