Java语言程序设计基础教程(文件和流)ppt.ppt_第1页
Java语言程序设计基础教程(文件和流)ppt.ppt_第2页
Java语言程序设计基础教程(文件和流)ppt.ppt_第3页
Java语言程序设计基础教程(文件和流)ppt.ppt_第4页
Java语言程序设计基础教程(文件和流)ppt.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

第8章文件和流 I O流概述文件处理过滤流字符流的处理对象的序列化其他常用的流 8 1I O流概述 输入 输出处理是程序设计中非常重要的一部分 比如从键盘读取数据 从文件中读取数据或向文件中写数据等等 Java把这些不同类型的输入 输出源抽象为流 stream 用统一接口来表示 从而使程序简单明了 Jdk提供了包java io 其中包括一系列的类来实现输入 输出处理 下面我们对java io包的内容进行概要的介绍 8 1 1I O流的层次 1 字节流 从InputStream和OutputStream派生出来的一系列类 这类流以字节 byte 为基本处理单位 InputStream OutputStream FileInputStream FileOutputStream PipedInputStream PipedOutputStream ByteArrayInputStream ByteArrayOutputStream FilterInputStream FilterOutputStream DataInputStream DataOutputStream BufferedInputStream BufferedOutputStream 2 字符流 从Reader和Writer派生出的一系列类 这类流以16位的Unicode码表示的字符为基本处理单位 Reader Writer InputStreamReader OutputStreamWriter FileReader FileWriter CharArrayReader CharArrayWriter PipedReader PipedWriter FilterReader FilterWriter BufferedReader BufferedWriter StringReader StringWriter 3 对象流 ObjectInputStream ObjectOutputStream4 其它 文件处理 File RandomAccessFile 接口DataInput DataOutput ObjectInput ObjectOutput 8 1 2InputStream和OutputStream 1 InputStream 从流中读取数据 intread 读取一个字节 返回值为所读的字节 intread byteb 读取多个字节 放置到字节数组b中 通常读取的字节数量为b的长度 返回值为实际读取的字节的数量 intread byteb intoff intlen 读取len个字节 放置到以下标off开始字节数组b中 返回值为实际读取的字节的数量 intavailable 返回值为流中尚未读取的字节的数量 longskip longn 读指针跳过n个字节不读 返回值为实际跳过的字节数量 关闭流 close 流操作完毕后必须关闭 使用输入流中的标记 voidmark intreadlimit 记录当前读指针所在位置 readlimit表示读指针读出readlimit个字节后所标记的指针位置才失效 voidreset 把读指针重新指向用mark方法所记录的位置booleanmarkSupported 当前的流是否支持读指针的记录功能 2 OutputStream 输出数据 voidwrite intb 往流中写一个字节bvoidwrite byteb 往流中写一个字节数组bvoidwrite byteb intoff intlen 把字节数组b中从下标off开始 长度为len的字节写入流中 flush 刷空输出流 并输出所有被缓存的字节 由于某些流支持缓存功能 该方法将把缓存中所有内容强制输出到流中 关闭流 close 流操作完毕后必须关闭 8 1 3I O中的例外 进行I O操作时可能会产生I O例外 属于非运行时例外 应该在程序中处理 如 FileNotFoundException EOFException IOException 8 2文件处理 I O处理中 最常见的是对文件的操作 java io包中有关文件处理的类有 File FileInputStream FileOutputStream RamdomAccessFile和FileDescriptor 接口有 FilenameFilter 8 2 1文件描述 类File提供了一种与机器无关的方式来描述一个文件对象的属性 下面我们介绍类File中提供的各种方法 文件或目录的生成publicFile Stringpath 如果path是实际存在的路径 则该File对象表示的是目录 如果path是文件名 则该File对象表示的是文件 publicFile Stringpath Stringname path是路径名 name是文件名publicFile Filedir Stringname dir是路径名 name是文件名 文件名的处理StringgetName 得到一个文件的名称 不包括路径 StringgetPath 得到一个文件的路径名StringgetAbsolutePath 得到一个文件的绝对路径名StringgetParent 得到一个文件的上一级目录名StringrenameTo FilenewName 将当前文件名更名为给定文件的完整路径 文件属性测试booleanexists 测试当前File对象所指示的文件是否存在booleancanWrite 测试当前文件是否可写booleancanRead 测试当前文件是否可读booleanisFile 测试当前文件是否是文件 不是目录 booleanisDirectory 测试当前文件是否是目录 普通文件信息和工具longlastModified 得到文件最近一次修改的时间longlength 得到文件的长度 以字节为单位booleandelete 删除当前文件 目录操作booleanmkdir 根据当前对象生成一个由该对象指定的路径Stringlist 列出当前目录下的文件 importjava io 引入java io包中所有的类publicclassep8 1 publicstaticvoidmain Stringargs Filedir newFile c java work 8 用File对象表示一个目录Filterfilter newFilter java 生成一个名为java的过滤器System out println listjavafilesindirectory dir Stringfiles dir list filter 列出目录下 文件后缀名为java的所有文件for inti 0 i files length i Filef newFile dir files i 为目录下的文件或目录创建一个File对象if f isFile 如果该对象为后缀为java的文件 则打印文件名System out println file f elseSystem out println subdirectory f 如果是目录则打印目录名 classFilterimplementsFilenameFilter Stringextent Filter Stringextent this extent extent publicbooleanaccept Filedir Stringname returnname endsWith extent 返回文件的后缀名 程序运行后的结果如下所示 首先列出当前工作目录 然后将当前目录下面的所有文件取出 根据过滤器设置 显示后缀为java的所有文件 8 2 2文件的顺序处理 类FileInputStream和FileOutputStream用来进行文件I O处理 由它们所提供的方法可以打开本地主机上的文件 并进行顺序的读 写 下面示例程序ep8 2的语句段中 顺序读取当前目录下文件名为text txt的文件里的内容 并显示在控制台上面 直到文件结束为止 文件text txt的内容为 welcome 如果当前目录下未找到文件text txt 程序运行时会报错 例8 2 一个顺序读取文本文件的例子 importjava io FileInputStream importjava io FileNotFoundException importjava io IOException publicclassep8 2 publicstaticvoidmain String args FileInputStreamfis try fis newFileInputStream text txt System out print contentoftextis intb while b fis read 1 顺序读取文件text里的内容并赋值给整型变量b 直到文件结束为止 System out print char b catch FileNotFoundExceptione System out println e catch IOExceptione System out println e 程序运行结果如下所示 8 2 3随机访问文件 对于InputStream和OutputStream来说 它们的实例都是顺序访问流 也就是说 只能对文件进行顺序地读 写 随机访问文件则允许对文件内容进行随机读 写 在java中 类RandomAccessFile提供了随机访问文件的方法 RandomAccessFile类既不是输入流InputStream的子类 也不是输出流OutputStream的子类 RandomAccessFile类创建的流的指向既可以作为源也可以作为目的地 当想对一个文件进行读写操作时 可以创建一个指向该文件的RandomAccessFile流即可 类RandomAccessFile的声明为 publicclassRandomAccessFileextendsObjectimplementsDataInput DataOutput接口DataInput中定义的方法主要包括从流中读取基本类型的数据 读取一行数据 或者读取指定长度的字节数 如 readBoolean readInt readLine readFully 等 接口DataOutput中定义的方法主要是向流中写入基本类型的数据 或者写入一定长度的字节数组 如 writeChar writeDouble write 等 构造方法 RandomAccessFile Stringname Stringmode 参数name确定一个文件名 参数mode是打开方式 决定流对文件的访问权限 例如r表示只读 rw表示可读写 RandomAccessFile Filefile Stringmode 参数file是一个文件对象 参数mode是打开方式 决定流对文件的访问权限 例如r表示只读 rw表示可读写 文件流指针的操作longgetFilePointer 用于得到流的当前的文件流指针位置 voidseek longpos 用于移动文件流指针到指定的位置 intskipBytes intn 使文件流指针向前移动指定的n个字节 例8 3 一个随机存取文本文件的例子 importjava io publicclassExample10 10 publicstaticvoidmain Stringargs RandomAccessFilein and out null intdata 1 2 3 4 5 6 7 8 9 10 try in and out newRandomAccessFile tom dat rw catch Exceptione try for inti 0 i 0 i in and out seek i 4 每隔4个字节往前读取一个整数System out print in and out readInt in and out close catch IOExceptione 把10个int类型整数写入到一个名字为tom dat文件中 然户按照相反的顺序读出这些数据并显示 程序运行后的结果如下所示 8 3过滤流 过滤流在读 写数据的同时可以对数据进行处理 它提供了同步机制 使得某一时刻只有一个线程可以访问一个I O流 以防止多个线程同时对一个I O流进行操作所带来的意想不到的结果 类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类 8 3 1过滤流类层次 过滤流类层次如下所示 java lang Object java io InputStream java io FilterInputStream为了使用一个过滤流 必须首先把过滤流连接到某个输入 出流上 通常通过在构造方法的参数中指定所要连接的输入 出流来实现 例如 FilterInputStream InputStreamin FilterOutputStream OutputStreamout 8 3 2几种常见的过滤流 BufferedInputStream和BufferedOutputStream缓冲流 用于提高输入 输出处理的效率 DataInputStream和DataOutputStream不仅能读 写数据流 而且能读 写各种的java语言的基本类型 如 boolean int float等 LineNumberInputStream除了提供对输入处理的支持外 LineNumberInputStream可以记录当前的行号 PushbackInputStream提供了一个方法可以把刚读过的字节退回到输入流中 以便重新再读一遍 PrintStream打印流的作用是把Java语言的内构类型以其字符表示形式送到相应的输出流 8 4字符流的处理 字节流不能直接操作Unicode字符 所以Java中提供了处理以16位的Unicode码表示的字符流的类 即以Reader和Writer为基类派生出的一系列类 汉字在文件中占用两个字节 如果使用字节流 读取不当会出现乱码 采用字符流可以避免这个现象 8 4 1Reader和Writer Reader和Writer这两个类是抽象类 只是提供了一系列用于字符流处理的接口 不能生成这两个类的实例 只能通过使用由它们派生出来的子类对象来处理字符流 1 Reader类是处理所有字符流输入类的父类 读取字符publicintread throwsIOException 读取一个字符 返回值为读取的字符 publicintread charcbuf throwsIOException 读取一系列字符到数组cbuf 中 返回值为实际读取的字符的数量 publicabstractintread charcbuf intoff intlen throwsIOException 读取len个字符 从数组cbuf 的下标off处开始存放 返回值为实际读取的字符数量 该方法必须由子类实现 标记流publicbooleanmarkSupported 判断当前流是否支持做标记 publicvoidmark intreadAheadLimit throwsIOException 给当前流作标记 最多支持readAheadLimit个字符的回溯 publicvoidreset throwsIOException 将当前流重置到做标记处 关闭流publicabstractvoidclose throwsIOException 2 Writer类是处理所有字符流输出类的父类 向输出流写入字符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 8 4 2InputStreamReader和OutputStreamWriter Java io包中用于处理字符流的最基本的类 用来在字节流和字符流之间作为中介 生成流对象publicInputStreamReader InputStreamin in是字节流 而InputStreamReader是字符流 但是其来源是字节流in 因此InputStreamReader就可以把字节流in转换成字符流处理 publicInputStreamReader InputStreamin Stringenc enc是编码方式 就是从字节流到字符流进行转换时所采用的编码方式 例如ISO8859 1 UTF 8 UTF 16等等publicOutputStreamWriter OutputStreamout out是字节流 而OutputStreamReader是字符流 publicOutputStreamWriter OutputStreamout Stringenc enc是编码方式InputStreamReader和OutputStreamWriter的方法 读入和写出字符基本同Reader和Writer 获取当前编码方式publicStringgetEncoding 关闭流publicvoidclose throwsIOException 8 4 3BufferedReader和BufferedWriter BufferedReader和BufferedWriter是关于Reader和Writer的过滤流 增强了Reader和Writer的处理能力 除了Reader和Writer中提供的基本的读写方法外 增加对整行字符的处理 能够一次读取一行文本 生成流对象publicBufferedReader Readerin 使用缺省的缓冲区大小 publicBufferedReader Readerin intsz sz为缓冲区的大小 publicBufferedWriter Writerout publicBufferedWriter Writerout intsz 读入 写出字符publicStringreadLine throwsIOException 读一行字符 publicvoidnewLine throwsIOException 写一行字符 例8 4 一个BufferedReader的例子 importjava io publicclassep8 4 publicstaticvoidmain Stringargs try InputStreamReaderir BufferedReaderin ir newInputStreamReader System in 从键盘接收了一个字符串的输入 并创建了一个字符输入流的对象in newBufferedReader ir Strings in readLine 从输入流in中读入一行 并将读取的值赋值给字符串变量sSystem out println Inputvalueis s inti Integer parseInt s 转换成int型i 2 System out println Inputvaluechangedafterdoubled i catch IOExceptione System out println e 8 5对象的序列化 Serialization 1 什么是序列化对象的寿命通常随着生成该对象的程序的终止而终止 有时候 可能需要将对象的状态保存下来 在需要时再将对象恢复 我们把对象的这种能记录自己的状态以便将来再生的能力 叫做对象的持续性 persistence 对象通过写出描述自己状态的数值来记录自己 这个过程叫对象的序列化 Serialization 2 序列化的目的序列化的目的是为Java的运行环境提供一组特性 其主要任务是写出对象实例变量的数值 8 5 2序列化方法 在java io包中 接口Serializable用来作为实现对象序列化的工具 只有实现了Serializable接口的类的对象才可以被序列化 1 定义一个可序列化对象 importjava io Serializable publicclassep8 5implementsSerializable intid 学号Stringname 姓名intage 年龄Stringdepartment 系别publicep8 5 intid Stringname intage Stringdepartment this id id this name name this age age this department department 这个类实现了Serializable接口 类中的成员变量id name age department都可以被序列化 方法不能序列化 2 构造对象的输入 输出流 要序列化一个对象 必须与一定的对象输入 输出流联系起来 通过对象输出流将对象状态保存下来 再通过对象输入流将对象状态恢复 java io包中 提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象 在ObjectInputStream中用readObject 方法可以直接读取一个对象 ObjectOutputStream中用writeObject 方法可以直接将对象保存到输出流中 importjava io FileInputStream importjava io FileOutputStream importjava io IOException importjava io ObjectInputStream importjava io ObjectOutputStream publicclassep8 6 publicstaticvoidmain String args throwsIOException ClassNotFoundException ep8 5stu newep8 5 981036 LiuMing 18 CSD FileOutputStreamfo fo newFileOutputStream data ser 保存对象的状态ObjectOutputStreamso newObjectOutputStream fo try so writeObject stu so close catch IOExceptione System out println e FileInputStreamfi newFileInputStream data ser ObjectInputStreamsi newObjectInputStream fi 恢复对象的状态try stu ep8 5 si readObject System out println stu id System out println stu name si close catch IOExceptione System out println e 在这个例子中 我们使用了前面定义的一个类ep8 5 实现了Serializable接口 然后通过对象输出流的writeObject 方

温馨提示

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

评论

0/150

提交评论