第9章IO流与文件_第1页
第9章IO流与文件_第2页
第9章IO流与文件_第3页
第9章IO流与文件_第4页
第9章IO流与文件_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

第9章I O流与文件 2 本章内容 输入流输出流文件 3 9 1文件与流的概念 9 1 1文件的基本概念文件 存储在磁盘上数据的集合 具有 永久性 文件中的数据以连续的字节或字符形式存在 并没有明显的结构组成文件的字节序列或字符序列分别被称为字节流或字符流流 Stream 在计算机的输入与输出之间的数据序列 按一定顺序排列的数据的集合 Java把不同的数据源与程序间的数据传输都抽象表述为 流 Java中的数据流有字节流 位流 和字符流之分Java命名惯例 凡是以InputStream或OutputStream结尾的类均为字节流凡是以Reader或Writer结尾的类均为字符流 9 1 2流的基本概念 Reader类Writer类 InputStream类OutputStream类 1字符 2字节 就流的运动方向而言 流可分为 输入流 inputstream 代表流入计算机的数据序列输出流 outputstream 代表从计算机流出的数据序列输入流 程序打开数据源上的一个流 文件或内存等 然后按顺序读入这个流中的数据输出流 程序打开一个目的地的流 然后按顺序从程序向这个目的地输出数据 输入和输出的方向是以程序为基准的通常 也把从输入流中输入数据到程序中称为读数据 read 反之 从程序中将数据输出到输出流中称为写数据 write 具体步骤一般为 打开一个流while 数据存在时 读数据或写数据关闭流 9 2字节输入 输出流 派生自InputStream和OutputStream常用的字节流主要有 InputStream和OutputStreamFileInputStream和FileOutputStreamDataInputStream和DataOutputStreamObjectInputStream和ObjectOutputStreamBufferedInputStream和BufferedOutputStreamByteArrayInputStream和ByteArrayOutputStream Java借助Java io包实现输入输出 InputStream类层次 9 2 1InputStream和FileInputStream 抽象类java io InputStream是所有字节输入流类的父类 定义了以字节为单位读取数据的基本方法 并在其子类中进行了分化和实现三个基本read方法 intread 从输入流读取下一个字节并返回 返回值的范围从0到255 如果已经到达数据流的结尾 则返回 1intread byte buffer 从输入流中读取若干字节放进数组buffer中 并返回读到的字符数 最多可读取和buffer长度相等的字符数 如果读取失败则返回 1intread byte buffer intoffset intlength 从输入流中读length个字节到数组buffer中 offset是写入数组的位置 位移 抽象方法 11 其它方法 voidclose 关闭输入流 释放相关系统资源intavailable 返回输入流中可读取的字节数skip longn 跳过流中若干字节数 返回实际跳过的字节数booleanmarkSupported 是否支持标记和复位操作voidmark intreadlimit 在流中当前位置作标记voidreset 返回最近标记的位置 不执行任何操作 例9 1 InputStream类的使用 importjava io InputStream importjava io IOException publicclassInputStreamUse publicInputStreamUse InputStreamin try while true inti in read charc char i System out print c catch IOExceptione System out print e e printStackTrace publicstaticvoidmain String args newInputStreamUse System in System out println System in引用的对象的类是 System in getClass getName 该语句执行后的输出为 System in引用的对象的类是 java io BufferedInputStream 多态 父类引用指向子类对象 很有可能出现异常 最好处理 FileInputStream类 FileInputStream类 文件输入流 是InputStream类的子类它们所提供的方法可以顺序读 写本地主机上的文件对文件内容的操作步骤如下 创建文件对应的输入 输出或者读写器的实例对象 以获取相关的资源文件 如所需内存空间以及文件的访问权限对文件进行读 输入 写 输出 操作调用close 方法 关闭文件 释放所占用的系统资源 例9 2 FileInputStream类的使用 importjava io FileInputStream importjava io publicclassFileInputStreamUse publicFileInputStreamUse try FileInputStreamf newFileInputStream 数字 txt inti intb f read 读取文件中的数据for i 0 b 1 i System out print char b b f read System out println System out println 文件字节数为 i f close catch IOExceptione System err println e e printStackTrace publicstaticvoidmain Stringargs newFileInputStreamUse 数字 txt 是和该类在同一目录下的文本文件名 9 2 2OutputStream和FileOutputStream 字节输出流抽象类OutputStream是所有字节输出流类型的抽象父类 为其它输出字节流子类提供了一些基本方法和标准接口三个基本的write方法 voidwrite intc 写入一个字节到输出流 将c的低 位写入 忽略24个高位voidwrite byte buffer 将数组buffer中的数据写入输出流voidwrite byte buffer intoffset intlength 将buffer数组中从第offset个字节开始 共length个字节写入输出流 其它方法 voidclose 关闭输出流 释放相关系统资源voidflush 清空缓存 将所有缓冲字节写入输出流 写入的数据通常先放到高速缓存 cache 里 等达到某一数量时 调用该方法将强迫数据写到预期目标 OutputStream类层次 例9 3 OutputStream类的使用 importjava io OutputStream importjava io publicclassOutputStreamUse publicOutputStreamUse OutputStreamout Strings 慈母手中线 游子身上衣 临行密密缝 意恐迟迟归 谁言寸草心 报得三春晖 byte b s getBytes try out write b 将字节数组b写出out flush 将把缓存中所有内容强制输出 catch IOExceptione System err println e e printStackTrace publicstaticvoidmain Stringargs newOutputStreamUse System out FileOutputStream 文件输出流FileOutputStream类是OutputStream类的子类 用于向文件写入数据FileOutputStream将数据写入文件的步骤 实例化对象 获取相关文件资源 通过FileOutputStream类的write 方法把数据写入到文件中 通过flush 方法强制输出调用close 方法 关闭文件 释放系统资源 例9 4 FileOutputStream类的使用 importjava io FileOutputStream importjava io publicclassFileOutputStreamUse publicFileOutputStreamUse Strings 有志者事竟成 破釜沉舟 百二秦关终属楚 苦心人天不负 卧薪尝胆 三千越甲可吞吴 byte b s getBytes try FileOutputStreamf newFileOutputStream 座右铭 txt f write b f flush f close catch IOExceptione System err println e e printStackTrace publicstaticvoidmain Stringargs newFileOutputStreamUse 若文件不存在就创建该文件 否则覆盖原文件内容 append为true时 使用FileOutputStream Stringname booleanappend 方法创建的实例在文本文件尾追加字符 而非覆盖 数据字节输入流DataInputStream类和数据字节输出流DataOutputStream类提供直接读或写基本数据类型数据的方法DataInputStream能够以一种与机器无关的方式 直接从底层字节输入流读取Java基本类型和Sring类型的数据 而不必关心这个数值应当是多少个字节 9 2 3DataInputStream和DataOutputStream DataInputStream常用方法包括 publicDataInputStream InputStreamin publicfinalbooleanreadBoolean publicfinalbytereadByte publicfinalcharreadChar publicfinaldoublereadDouble publicfinalfloatreadFloat publicfinalintreadInt publicfinallongreadLong publicfinalshortreadShort publicfinalStringreadUTF publicvoidclose 读入一个字符串 DataOutputStream则能够直接将Java基本类型和String类型数据写出到其它的字节输出流 DataInputStream常用方法包括 publicDataOutputStream OutputStreamout publicfinalvoidwriteByte intv publicfinalvoidwriteShort intv publicfinalvoidwriteInt intv publicfinalvoidwriteLong longv publicfinalvoidwriteFloat floatv publicfinalvoidwriteDouble doublev publicfinalvoidwriteChar intv publicfinalvoidwriteBoolean booleanv publicfinalvoidwriteChars Strings publicfinalintsize 返回实际写入的字节数publicvoidflush publicvoidclose importjava io FileInputStream importjava io FileOutputStream importjava io DataInputStream importjava io DataOutputStream publicclassDataStreamUse publicDataStreamUse try FileOutputStreamfout newFileOutputStream out txt DataOutputStreamdfout newDataOutputStream fout for inti 0 i 6 i dfout writeInt i dfout close FileInputStreamfin newFileInputStream out txt DataInputStreamdfin newDataInputStream fin for inti 0 i 6 i System out print dfin readInt dfin close catch Exceptione System err println e e printStackTrace publicstaticvoidmain Stringargs newDataStreamUse 例9 5 数据字节流的使用 从一个流产生另一个流 9 2 4ObjectInputStream和ObjectOutputStream 类ObjectOutputStream和ObjectInputStream分别继承了接口ObjectOutput和ObjectInput 将数据流功能扩展到可以读写对象ObjectInputStream类和ObjectOutputStream类创建的对象被称为对象输入流和对象输出流对象输出流使用writeObject Objectobj 方法将一个对象obj写入输出流 将对象状态保存下来 将对象保存到文件中 或者通过网络传送到其他地方 对象输入流使用readObject 从源中读取一个对象到程序中 将对象状态恢复 Java允许可序列化的对象通过对象流进行传输只有实现Serializable接口的类才能被序列化 Serializable接口中没有任何方法 当一个类声明实现Serializable接口时 只是表明该类加入对象序列化协议一个类如果实现了Serializable接口 那么这个类创建的对象就是所谓可序列化的对象实际上 类ObjectOutputStream和ObjectInputStream分别实现了对象的序列化和反序列化功能 恢复对象状态 保存对象状态 序列化只能保存对象的非静态成员变量 且保存的只是变量的值 而不能保存任何成员方法和静态成员变量某些对象的状态是瞬时的 无法保存 如Thread对象或流对象 对于这样的成员变量 必须用transient关键字标明 任何用transient关键字声明的成员变量都不会被保存序列化可能将对象存放到磁盘上或在网络上发送 会产生安全问题 需要保密的数据不应保存在永久介质中 或不应简单地不加处理地保存下来 为保证安全 应在这些变量前加上transient关键字 有时我们想得到对象的一个 复制品 该复制品的实体是原对象实体的拷贝 复制品实体的变化不会引起原对象实体发生变化 这样的复制品称为原对象的克隆对象或简称克隆 使用对象流很容易得获取一个序列化对象的克隆 我们只需将该对象写入到对象输出流 那么用对象输入流读回的对象一定是原对象的一个克隆 9 2 5BufferedInputStream和BufferedOutputStream 类BufferedInputStream和类BufferedOutputStream是带缓存的输入流和输出流 即缓冲流在实例化类BufferedInputStream和类BufferedOutputStream对象时 会在内存中开辟一个字节数组用来存放数据流中的数据借助字节数组 在读取或者存储数据时可以以字节数组为单位把数据读入内存 或以字节数组为单位把数据写入指定的文件中 从而大大提高数据的读 写效率 类BufferedInputStream的构造方法 BufferedInputStream InputStreamin 其中in是指定的输入流 通常是FileInputStream的实例对象 BufferedInputStream InputStreamin intsize 其中 in同前 size是大于0的数 用于指定缓存大小与类BufferedOutputStream的构造方法类似 从一个流构造另一个流 从底层流构造高级流时就会创建流链 FileInputStreamf newFileInputStream file dat BufferedInputStreamb newBufferedInputStream f DataInputStreamd newDataInputStream b 例9 8 缓存流的使用 importjava io FileInputStream importjava io BufferedInputStream importjava util Date publicclassBufferedStreamUse privatestaticStringfileName 毕业那年我们二十三岁 txt publicBufferedStreamUse try inti 0 intch Dated1 newDate 创建获取当前时间的对象FileInputStreamf newFileInputStream fileName while ch f read 1 i f close Dated2 newDate longt d2 getTime d1 getTime System out printf 读取文件 s 共 d字节 n fileName i System out printf 不带缓存的方法需要 1 d毫秒 n t i 0 d1 newDate f newFileInputStream fileName BufferedInputStreamfb newBufferedInputStream f while ch fb read 1 i fb close d2 newDate t d2 getTime d1 getTime System out printf 带缓存的方法需要 1 d毫秒 n t catch Exceptione System err println e e printStackTrace publicstaticvoidmain Stringargs newBufferedStreamUse 9 2 6标准的输入 输出流 java lang包的System类定义了三个静态成员变量 staticfinalInputStreamin 标准输入instaticfinalPrintStreamout 标准输出outstaticfinalPrintStreamerr 标准错误输出errin可以直接调用InputStream类提供的输入方法 out和err可以直接调用PrintStream类提供的输出方法out用于屏幕输出 常用方法有 System out print Stringstr 向屏幕输出字符串strSystem out println Stringstr 向屏幕输出字符串str后换行in用于屏幕输入 常用方法有 System in read 返回从键盘输入的字符System in read byte b 从键盘输入多个字符到数组b 并返回字符个数 都可被重定向 err通常不 out会被缓冲 err不会 PrintStream 类PrintStream是标准的输出类 在OutputStream基础上提供了增强的功能 可以方便地输出各种类型数据 而不仅限于byte型 的格式化表示形式PrintStream从不抛出IOException类 可用checkError方法检测 构造方法 publicPrintStream OutputStreamout publicPrintStream OutputStreamout BooleanautoFlsh 是否自动刷新 36 autoFlash为true时 采用自动刷新 当输出回车换行时 缓存中的数据一般会全部自动写入 默认不自动刷新 将向其中写入的目标流 PrintStream常用方法 publicvoidprint booleanb publicvoidprint charc publicvoidprint longl publicvoidprint inti publicvoidprint floatf publicvoidprint doubled publicvoidprint Strings publicvoidprint Objectobj publicvoidprintln 37 将指定数据写入目标流 例9 9 标准输入 输出流的使用 importjava io IOException publicclassStandardInputOutputUse 抛出异常交由Java虚拟机处理publicstaticvoidmain Stringargs throwsIOException System out print 请从键盘上输入数据 bytebuffer newbyte 512 intcount System in read buffer System out print 通过标准的输出 输出的数据 for inti 0 i count i System out print buffer i 按字节方式输出bufferSystem out println for inti 0 i count i System out print char buffer i 按字符方式输出bufferSystem out println count count 实际读取的字节数 9 3字符输入 输出流 以16位的Unicode码表示的字符为基本处理单位 又称为读 写器由抽象类Reader和Writer派生常用的字符流主要有 Reader和WriterFileReader和FileWriterBufferedReader和BufferedWriter 9 3 1Reader和Writer 抽象类Reader和Writer只是提供了一系列用于字符流处理的方法 只能通过使用由它们派生出来的子类对象来处理字符流Reader是所有字符输入流类型的父类 其中声明了用于读取字符流的有关方法三个基本的read方法 intread 读取一个字符 返回值为读取的字符intread charcbuf 读取一系列字符到数组cbuf 中 返回值为实际读取的字符数intread char cbuf intoff intlen 读取len个字符 从数组cbuf 的下标off处开始存放 返回值为实际读取的字符数 抽象方法 读到文件末尾时返回 1 其它方法 voidclose 关闭当前字符流并释放与字符流相关的系统资源skip longn 略过n个字节不读取 返回实际略过的字节数目booleanmarkSupported 判断当前流是否支持做标记voidmark intreadAheadLimit voidreset 将当前流重置到做标记处 Reader类层次 抽象类Writer是所有字符输出流类型的共同父类五个基本的write方法 voidwrite intc 将整数c的低16位写入当前输出流voidwrite char cbuf 将字符数组cbuf 写入当前输出流voidwrite char cbuf intoffset intlength 将字符数组cbuf 中从下标off处开始的len个字符写入当前输出流voidwrite Stringstr 将字符串str写入当前输出流voidwrite Stringstr intoff intlen 将字符串str中从下标off处开始的len个字符写入当前输出流 其它方法 Writerappend CharSequencecsq 将字符序列csq添加到当前输出流Writerappend charc 将字符c添加到当前输出流voidclose 关闭当前字符流并释放相关系统资源voidflush 清空缓存 使所有缓冲字符立即写入输出流 Writer类层次 9 3 2FileReader和FileWriter 抽象类Reader和Writer类的子类 用于读 写字符文件与FileInputStream FileOutputStream字节流相对应 例9 10 文件字符流的使用 importjava io FileReader importjava io FileWriter importjava io IOException publicclassFileReaderWriterUse publicFileReaderWriterUse try FileWriterwriter newFileWriter 日记 txt writer write 今天非常开心 上午在路上帮助一个女生捡书 下午帮助一个同学答到 没有被老师发现 虽然老师没有发现 但是我还是很愧疚 毕竟这是不允许的 也是不厚道的事情 晚上同学过生日 蹭一顿饭 甚是开心 最纠结的事情是明天老师要提问 希望明天会更好 writer close FileReaderreader newFileReader 日记 txt for intc reader read c 1 c reader read System out print char c reader close catch IOExceptione System err println e e printStackTrace publicstaticvoidmain Stringargs newFileReaderWriterUse 9 3 3BufferedReader和BufferedWriter BufferedReader类 LineNumberReader类和BufferedWriter类以缓冲流方式进行数据读写操作BufferedReader类的构造方法 BufferedReader Readerin 使用缺省的缓冲区大小BufferedReader Readerin intsz sz为缓冲区的大小除了read 和write 方法外还提供了整行字符处理方法 StringreadLine 读取一行字符串 输入流结束时返回null 默认大小足够用 行处理字符流LineNumberReader是类BufferedReader的子类 构造方法 LineNumberReader Readerin LineNumberReader Readerin intsz 行 由换行符 n 回车符 r 或二者共同终止StringgetLineNumber 获取当前行号voidsetLineNumber int 设置当前行号 默认行号从0开始 随数据读取在每个行结束符处递增 不实际更改流中当前位置 只改getLineNumber 将返回的值 BufferedWriter将数据缓冲到字符输出流 构造方法 BufferedWriter Writerout BufferedWriter Writerout intsz 行处理方法 voidnewLine 向输出流中写入一个行结束标志 不是简单的换行符 n 或 r 而是系统定义的行隔离标志 lineseparator 例9 11 缓冲字符流的使用 importjava io FileReader importjava io FileWriter importjava io BufferedWriter importjava io LineNumberReader importjava io IOException publicclassBufferedReaderWriterUse publicBufferedReaderWriterUse try BufferedWriterbw newBufferedWriter newFileWriter 励志 txt bw write 有志者 事竞成 bw newLine bw write 苦心人 天不负 bw newLine bw close LineNumberReaderbr newLineNumberReader newFileReader 励志 txt Strings for s br readLine s null s br readLine System out println br getLineNumber s br close catch IOExceptione System err println e e printStackTrace publicstaticvoidmain Stringargs newBufferedReaderWriterUse 9 4文件操作类 File类的对象是磁盘上的文件和路径的抽象表示形式 可设置文件或者目录的各种属性 文件名 文件大小 文件类型 文件修改日期和文件权限等 可判断指定文件是否存在 获取当前文件路径 获取当前目录文件列表 创建文件 删除文件 创建目录和删除目录等不涉及对文件的读写操作 文件内容的读 写操作由流实现 File类的实例是不可变的 即 一旦创建 File对象表示的抽象路径名将永不改变 File类构造方法 File Stringpathname 例如 封装一个文件 Filef1 newFile mydir myfile txt 例如 封装一个目录 Filef2 newFile d mydir dir1 File Stringparent Stringchild 例如 Filef3 newFile d d1 a java File Filedir Stringname 例如 Filef4 newFile f2 myfile txt 分隔符 win unix 使用相对路径 移植性较好 绝对路径 File类方法 判断目标是否存在 publicbooleanexists 判断是文件还是目录 publicbooleanisFile publicbooleanisDirectory 获取文件名称或整个路径publicStringgetName 仅返回文件名publicStringgetPath 返回整个路径publicStringgetAbsolutePath 返回绝对路径获取文件读写属性 publicbooleancanRead 是否可读publicbooleancanWrite 是否可写 File类方法 获取上一级目录 publicStringgetParent 获取文件长度 publiclonglength 获取最近一次修改的时间 publiclonglastModified 列出当前目录中的文件和目录 publicString list publicFile listFiles 重命名 publicbooleanrenameTo Filenew 删除文件或目录 publicbooleandelete 创建目录 publicbooleanmkdir 例9 12 文件类的使用 importjava io File importjava util Date importjava text SimpleDateFormat importjava io IOException publicclassFileUse publicFileUse Filedir newFile 当前目录intcount dirs 0 统计目录数intcount files 0 统计文件数longbyte files 0 统计所有文件总字节数System out println dir getAbsolutePath 目录 r n SimpleDateFormat类是日期格式转换 日期 文本 文本 日期 SimpleDateFormatsdf newSimpleDateFormat yyyy MM ddhh mm File files dir listFiles for inti 0 i是查看当前所在目录的文件和目录System out print t count dirs System out println sdf format newDate files i lastModified System out println r n共有 count files 个文件 总字节数为 byte files System out println 共有 count dirs 个目录 publicstaticvoidmain Stringargs throwsIOException newFileUse 9 4 2随机访问文件类 通常 输入流只能从中读取数据 而不能向其写出数据 输出流则只能向其写出数据 而不能从中读取数据 但有一个特例 RandomAccessFile类 直接继承object 同时实现了接口DataInput和DataOutput该类创建的流的指向既可以作为源也可以作为目的地 所以既可以用来处理文件的输入 又可以处理文件的输出 实现对同一个文件的交替读写 并允许指定读写位置 字节流 RandomAccessFile类将文件看作字节数组 用文件指针指示当前位置新建RandomAccessFile类的对象后 文件指针指向文件头读取或存储数据后 文件指针指向刚读取或写入的数据后因为Java的各种基本数据类型大小固定 不依赖于具体的计算机或操作系统 所以可方便地计算出文件指针的当前位置和所需移动到的位置 59 构造方法 RandomAccessFile Filefile Stringmode file指定流的源 同时也是流目的地 mode取r 只读 或rw 可读写 决定流对文件的访问权限RandomAccessFile Stringname Stringmode name指定一个文件名 给出流的源 同时也是流目的地 访问模式mode取r 只读 或rw 可读写 决定流对文件的访问权限 60 常用方法 longgetFilePointer 获取文件指针位置 距文件头的字节数 voidseek longpos 设置文件指针到pos处 pos为整数 表示字节数 为0时表示移到文件头intread 读取一个字节voidwrite intv 写入v的低8位StringreadLine 读入一行longlength 返回文件长度voidclose 关闭文件 61 intreadInt 读取一个整数voidwriteInt intv 写入一个整数 读写基本数据类型数据及字符串 62 例9 13 随机访问文件类的使用 importjava io RandomAccessFile importjava io IOException publicclassRandomAccessFileUse publicRandomAccessFileUse try RandomAccessFilef newRandomAccessFile 写偶数 txt rw inta for inti 0 i 10 i 写入10个偶数 0 2 4 6 18f writeInt 2 i f seek 8 定位到第三个偶数上 f writeInt 0 f seek 0 将文件指针定位到文件的头部for inti 0 i 10 i a f readInt System out println i a f close catch IOExceptione System err println e e printStack

温馨提示

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

评论

0/150

提交评论