




已阅读5页,还剩71页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java基础系列 IO 一 文件和目录 File类概述File类构造器File类的常用方法 1 File类概述 File类的对象是文件系统中的一个目录或文件的抽象表示 File类对象描述文件路径 名字 长度 可否读写等属性 可用来命名文件 查询文件属性 对目录进行操作 但不读写文件 读写文件内容分别是由FileInputStream和FileOutputStream类实现的 通过File类对象可以对操作系统的文件进行管理 体现了跨平台不同文件的统一管理 2 File类构造器 File有三个重载的构造方法 1 File Stringpath 2 File Stringpath Stringname 3 File Filedir Stringname 2 File类构造器 File Stringpath Path可以是文件的完整路径名 也可只有路径而无文件名 路经可以是绝对路径 也可以是相对路径 路径或文件名可以是已存在的也可是新的 新的则被创建 旧的则被刷新 例1 Filefile1 newFile f java aaa 在已存在的f java目录下新创建一个aaa目录 使用的是绝对路径 且只能创建一层新目录 例2 Filefile2 newFile bbb 在当前工作目录下 创建bbb新目录的文件对象 使用的是相对路径例3 Filefile3 newFile f java file1 txt 使用绝对路径 在已存在的f java 目录下创建一个文本文件对象 2 File类构造器 File Stringpath Stringname Path 已存在的文件路径 Name 可以是路径或文件名 可以是新的或原有的 例4 Filefile4 newFile f java aaa 与例1效果相同例5 Filefile5 newFile f java file1 txt 与例3效果相同 2 File类构造器 File Filedir Stringname dir 为文件对象 由该对象指定路径 称抽象路径name 文件名或目录名例6 Filefile1 newFile f java aaa Filefile6 newFile file1 myfile txt 3 File类的常用方法 示例 二 JavaIO库 概述JavaI O库设计原则输入流 输出流字节流 字符流流处理器 原始流处理器 装饰流处理器 IO类的继承结构流的适配 1 JavaIO概述 通常程序需要从外部获取 输出信息这个 外部 范围很广 包括诸如键盘 显示器 文件 磁盘 网络 另外一个程序等 信息 也可以是任何类型的 例如一个对象 串字符 图像 声音等Java把不同类型的输入 输出源抽象为流 stream 用统一接口来表示 从而使程序简单明了 所谓流 就是数据的有序排列 而流可以是从某个源 称为流源 SourceofStream 出来 到某个目的地 称为流汇 SinkofStream Java中负责I O的类 称为流类 统一存放在java io包中 该包又叫做I O库 1 JavaIO概述 读写数据的方法 不论数据从哪来 到哪去 也不论数据本身是何类型 读写数据的方法大体上都是一样的 1 JavaIO概述 流的分类 输入 输出流可以从以下几个方面进行分类从流的方向划分输入流输出流从流的分工划分节点流 原始流 处理流 链接流 从流的内容划分面向字符的流面向字节的流 2 JavaI O库的设计原则 两个对称性 输入 输出对称 InputStream和OutputStream提供了面向字节的I O功能 Reader和Writer提供了面向字符的I O功能 byte char对称 InputStream与Reader的子类分别负责byte和char流的输入 OutputStream和Writer的子类分别负责byte和char流的输出 两个设计模式 装饰模式 有些流处理器可以对另一些流处理器起到装饰作用 形成新的具有改善了功能的流处理器 接口不改变 但增加功能 适配器模式 有些流处理器是对其他类型的流源的适配 接口改变 但不增加功能 两种流原始流 原始流处理器接收一个Byte数组对象 String对象或文件对象 并声称一个InputSteam类型的流对象例如 ByteArrayInputStream FileInputStream PipedInputStream StringBufferInputStream 链接流 装饰流 可以接收另一个 同种类 流对象作为流源 并对其进行功能扩展 同样类型的流用做链接流类的流源 例如 FilterInputStream下的BufferedInputStream DataInputStream LineNumberInputStream PushbackInputStream ObjectInputStream和SequenceInputStream 2 JavaI O库的设计原则 3 字节流与字符流 按处理数据的单位划分 Java支持两种基本的流类型 字节流类 以字节 byte 为流动单位基类InputStream OutputSream字符流类 以16位字符 Unicode 为流动单位基类Reader Writer 说明 以字符为导向的stream基本上对有与之相对应的以字节为导向的stream 两个对应类实现的功能相同 只是在操作时的导向不同 如CharArrayReader 和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用 所不同的是前者每次从内存中读取一个字节的信息 而后者每次从内存中读取一个字符 3 字节流与字符流 4 流处理器 流的处理过程 用来处理流的流类又称为流处理器 一个流处理器就像一个流的管道一样 从一个流源吸入某种类型的数据 并输出某种类型的数据 例如 一个java程序可以使用FileInputStream类直接从一个文件中读取数据 如下图所示 像FileInputStream这样的流类叫做流处理器 4 流处理器 流的处理过程 类似地 也可以用FileOutputStream类直接向一个文件中写出数据 如下图所示 在实际应用当中 这种简单的机制并没有太大的用处 因为程序需要写出的往往是非常结构化的信息 比如数值 文字 源代码等 这样一来 数据的转换工作将十分复杂 4 流处理器 流的处理过程 Java的I O库提供了一个称作链接 Chaining 的机制 可以将一个流处理器与另一个流处理器首尾相接 以其中之一的输出为输入 形成一个流管道的链接例如 DataInputStream流处理器可以把FileInputStream流对象的输出当作输入 将byte类型的数据转换成java的基本数据类型和String类型的数据 如下图所示 4 流处理器 流的处理过程 类似地 向一个文件写入byte类型的数据不是一个简单的过程 一个程序需要向一个文件里面写入的数据往往是结构化的 而不是byte类型的 因此在利用FileOutputStream写的时候必须首先经过转换 DataOutputStream流处理器提供了直接接收基本数据类型和String类型的方法 而这个流处理器的输出数据则是byte类型 这样一来 可以将DataOutputStream和FileOutputStream链接起来 达到直接将结构化的数据写入到文件中的目的 4 流处理器 分类 流处理器所处理的流必定都有流源 流源分成两大类 数组 String File等 叫原始流源用于链接流类的流源 叫链接流源Java语言的I O库是对各种常见的流源 流汇 以及处理过程的抽象化Java语言的I O库是由一些基本的原始流处理器和围绕它们的装饰流处理器所组成的 5 IO类的继承结构 字节输入流字节输出流字符输入流字符输出流 字节输入流 基类InputStream 类声明 publicabstractclassInputStreamextendsObjectimplementsCloseable三个基本的read方法 abstractintread 这里的read方法是为了更复杂的类可以利用它们 以便提供一个更有用的接口intread byte b 从输入流中读取字节数据保存到数组b中intread byte b intoffset intlength 其它方法 voidclose 关闭输入流并释放与之相关的所有系统资源intavailable 返回输入流中可以读的字节数longskip longn 从输入流中跳过n个字节booleanmarkSupported 测试输入流是否支持mark reset方法voidmark intreadlimit 在输入流中标记当前位置voidreset 重新配置输入流 字节输入流 继承结构 InputStream有7个直接子类 有4个属于FilterInputStream的子类 字节输入流 继承结构 原始流处理器 接收一个byte数组对象 String对象 FileDescriptor对象等原始流源对象 并生成一个InputStream类型的流对象 共有4个 ByteArrayInputStream 为多线程的通信提供缓冲区操作功能 接收一个byte数组作为流源FileInputStream 建立一个与文件有关的输入流 接收一个File对象作为流源PipedInputStream 与PipedOutputStream配合使用 接收一个PipedOutputStream对象作为流源StringBufferInputStream 将一个字符串缓冲区转换成一个输入流 接收一个String对象作为流源 字节输入流 继承结构 链接流处理器 就是可以接收另一个流对象作为流源 并对之进行功能扩展的流类InputStream类型的链接流处理器包括以下7个 都接收另一个InputStream对象作为流源FilterInputStream 过滤输入流 它将另一个输入流作为流源 它有4个子类 BufferedInputStream 用来从硬盘将数据读入到一个内存缓冲区中 并从该缓冲区提供数据DataInputStream 提供基于多字节的读取方法 可以读取基本数据类型的数据LineNumberInputStream 提供带有行计数功能的过滤输入流PushbackInputStream 提供特殊功能 可以将已经读取的字节 推回 到输入流中ObjectInputStream 可以将使用ObjectOutputStream串行化的基本数据类型和对象重新并行化SequenceInputStream 可将两个已有的输入流连接起来形成一个输入流 字节输入流 继承结构 原始流处理器可以被链接流处理器所装饰 一方面 链接流对象接收一个原始流对象或者另一个链接流对象作为流源 表现形式上就是把它们作为链接流类构造函数的参数 另一方面 它们都对流源对象的内部工作方法做了相应的改变 比如 BufferedInputStream 装饰了InputStream的内部工作方式 使得流的读入操作使用缓冲机制 即不会对每一次的流读入操作都产生一个物理的读盘动作 LineNumberInputStream和PushbackInputStream 使得流的读入操作带有行计数功能或者可以将已经读取的字节 推回 到输入流中 它们在实际工作中很少用到 它们是为了支持用java语言制作编译器而准备的 DataInputStream 可以读取各种不同的基本数据类型以及String类型的数据 这一点可以从它所提供的各个read方法可以看出来 使用这个流处理器以及它的搭档DataOutputStream 可以将原始数据从一个地方通过流移到另一个地方 字节输出流 基类OutputStream 类声明 publicabstractclassOutputStreamextendsObjectimplementsCloseable Flushable三个基本的write方法 abstractvoidwrite intc 这里的write方法是为了更复杂的类可以利用它们 以便提供一个更有用的接口voidwrite byte b 将数组b中的数据写入到输出流中voidwrite byte b intoffset intlength 其它方法voidclose 关闭输出流并释放与之相关的所有系统资源voidflush 刷新流内部的缓冲区 以强制将数据真正写入目标 字节输出流 继承结构 OutputStream有5个直接子类 有3个属于FilterOutputStream的子类 字节输出流 继承结构 原始流处理器ByteArrayOutputStream 输出流的汇集是一个byte数组FileOutputStream 输出流的汇集是一个文件对象PipedOutputStream 用于向一个数据管道输出数据 字节输出流 继承结构 链接流处理器 FilterOutputStream 过滤输出流 它将另一个输出流作为流汇 其子类有 BufferedOutputStream 向一个内存缓冲区中写出数据 并将此中的数据输出到硬盘中DataOutputStream 可以写出基本数据类型的数据PrintStream 用于产生格式化输出ObjectOutputStream 将基本数据类型和对象串行化与DataInputStream相对应的是DataOutputStream 后者负责将由基本数据类型和String对象组成的数据格式化 并输出到一个流中 使得任何机器上的任何DataInputStream类型的对象都可以读入这些数据 所有的写方法都以write开始 比如writeByte 等 字节输出流 继承结构 如果需要对数据做真正的格式化 以便输出到像控制台显示那样 就要用PrintStream PrintStream可以对基本数据类型和String对象组成的数据进行格式化 以形成可阅读的格式 System out就是一个静态的PrintStream对象 PrintStream对象最重要的两个方法是print 和println BufferedOutputStream 对一个输出流进行装饰 使得流的写出操作使用缓冲操作 提高程序效率 在涉及到物理流的地方 比如控制台I O 文件I O等 都应当使用这个装饰流处理器 字符输入流 基类Reader 类声明 publicabstractclassReaderextendsObjectimplementsReadable Closeable三个基本的read方法 intread 读取单个字符intread char cbuf 读取字符到字符数组cbuf中intread CharBuffertarget abstractintread char cbuf intoffset intlength 这里的read方法是为了更复杂的类可以利用它们 以便提供一个更有用的接口其它方法voidclose booleanready 测试流是否准备好被读取skip longn booleanmarkSupported voidmark intreadAheadLimit voidreset 字符输入流 等级结构 Reader有6个直接子类 字符输入流 继承结构 原始流处理器 CharArrayReader 为多线程通信提供缓冲区操作功能InputStreamReader 有一个子类FileReaderPipedReader 与PipedInputStream配合使用 用于读入一个数据管道里的数据StringReader 建立一个与文件有关的输入流链接流处理器 BufferedReader 从硬盘将数据读入到一个内存缓冲区 并从该缓冲区提供数据FilterReader 它将另一个输入流作为流源 字符输出流 基类Writer 类声明 publicabstractclassWriterextendsObjectimplementsAppendable Closeable Flushable三个基本的write方法 voidwrite intc voidwrite char cbuf abstractvoidwrite char cbuf intoffset intlength 这里的write方法是为了更复杂的类可以利用它们 以便提供一个更有用的接口 voidwrite Stringstring voidwrite Stringstring intoffset intlength 其它方法abstractvoidclose abstractvoidflush 字符输出流 继承结构 Writer有7个直接子类 字符输出流 继承结构 原始流处理器 CharArrayWriter 为多线程通信提供缓冲区操作功能OutputStreamWriter 建立一个与文件有关的输出流PipedWriter 与PipedOutputStream配合使用StringWriter 向一个StringBuffer写出数据链接流处理器 BufferedWriter 为Writer类型的流处理器提供缓冲区功能FilterWriter 没有子类的抽象类 将另一个输出流作为流源PrintWriter 支持格式化的文字输出 6 流的适配 byte流到char流 InputStreamReader是从byte流到char流的一个桥梁 它读入byte数据并根据指定的编码将之翻译成为char数据当把InputStreamReader与任何InputStream的具体子类链接时 可以从InputStream的输出读入byte类型的数据 将之转换成char类型的数据 6 流的适配 byte流到char流 类似地 当与任何一个OutputStream的具体子类链接时 OutputStreamWriter可以将char类型的数据转换成为byte类型的数据 再交给输出流 四 常见流介绍 FileI O数据输入 输出流压缩文件流对象序列化 1 FileI O 文件对象的建立Filefp newFile tempfile txt 文件流的建立FileInputStreamin newFileInputStream fp FileOutputStreamout newFileOutputStream fp 其中 输入流的参数是用于输入的文件名 输出流的参数是用于输出的文件名 1 FileI O 示例 1 FileI O 性能优化 增加缓冲区流 减少访问硬盘的次数 提高效率 1 FileI O 性能优化 缓冲区流 BufferedInputStream和BufferedOutputStream将它们与文件流相接FileInputStreamin newFileInputStream file1 txt BufferedInputStreambin newBufferedInputStream in 256 只有缓冲区满时 才会将数据送到输出流 Java在输出数据流中 当对方尚未将数据取走时 程序就会被阻塞 有时要人为地将尚未填满的缓冲区中的数据送出 使用flush 方法 2 数据输入输出流 什么时候需要数据输入输出流 文件流和缓冲区流的处理对象是字节或字节数组 利用数据输入输出流可以实现对文件的不同数据类型的读写 DataInputStream DataOutputStream一种较为高级的数据输入输出方式 包含以下功能 除了字节和字节数组 还可以处理int float boolean等类型 用readLine方法读取一行信息 2 数据输入输出流 数据流的建立FileOutputStreamfos newFileOutputStream file2 txt DataInputStreamdis newDataInputStream fos 数据输出流可以是一个已经建立好的输入数据流对象 例如网络的连结 文件等 3 处理压缩文件 压缩流类 java util zip包中提供了一些类 使我们可以以压缩格式对流进行读写它们都继承自字节流类OutputStream和InputStream其中GZIPOutputStream和ZipOutputStream可分别把数据压缩成GZIP格式和Zip格式GZIPInputStream和ZipInputStream可以分别把压缩成GZIP格式或Zip的数据解压缩恢复原状 3 处理压缩文件 简单的GZIP压缩格式 GZIPOutputStream父类是DeflaterOutputStream可以把数据压缩成GZIP格式GZIPInputStream父类是InflaterInputStream可以把压缩成GZIP格式的数据解压缩 示例 首先文本文件 Hello txt 压缩为文件 test gz 再解压该文件 显示其中内容 并另存为 newHello txt 3 处理压缩文件 运用ZIP压缩多个文件 Zip文件可能含有多个文件 所以有多个入口 Entry 每个入口用一个ZipEntity对象表示 该对象的getName 方法返回文件的最初名称ZipOutputStream父类是DeflaterOutputStream可以把数据压缩成ZIP格式ZipInputStream父类是InflaterInputStream可以把压缩成ZIP格式的数据解压缩 示例 1 从命令行输入若干个文件名 将所有文件压缩为 c test zip 再从此压缩文件中解压并显示 2 用来将指定zip文件解压到指定路径下 4 对象序列化 什么是对象序列化 objectserialization 对象串行化面向那些实现了Serializable接口的对象 允许你以串行字节序列形式保存对象的状态 日后还可以将其完全恢复到对象的初始状态恢复一个串行化后的对象称为解串行化 deserialization 为什么要串行化呢 串行化机制使Java语言得以支持两个重要功能Java的远程方法调用 RemoteMethodInvocation RMI 允许你 通过本地机器上的对象运用方式 使用其它机器上的对象 保持数据对象实例变量的数值和当时的运行环境 可不受对象生命周期的限制 供其它类 其它时间共享 序列化接口 Seriealizable接口 空接口 使类的对象可实现序列化Serializable接口的定义packagejava io publicinterfaceSerializable there snothinginhere 实现Serializable接口的语句publicclassMyClassimplementsSerializable 序列化接口 Externalizable接口 实现该接口可以控制对象的读写API中的说明为publicinterfaceExternalizableextendsSerializable其中有两个方法writeExternal 和readExternal 因此实现该接口的类必须实现这两个方法ObjectOutputStream的writeObject 方法只写入对象的标识 然后调用对象所属类的writeExternal ObjectInputStream的readObject 方法调用对象所属类的readExternal 4 对象序列化 注意事项 串行化能保存的元素只能保存对象的非静态成员变量 不能保存任何的成员方法和静态的成员变量 而且串行化保存的只是变量的值 对于变量的任何修饰符 都不能保存 transient关键字对于某些类型的对象 其状态是瞬时的 这样的对象是无法保存其状态的 例如一个Thread对象 或一个FileInputStream对象 对于这些字段 我们必须用transient关键字标明 定制串行化缺省的串行化机制 对象串行化首先写入类数据和类字段的信息 然后按照名称的上升排列顺序写入其数值 如果想自己明确地控制这些数值的写入顺序和写入种类 必须定义自己的读取数据流的方式 就是在类的定义中重写接口serializeble的writeObject 和readObject 方法 例如可在上例子中 加入重写的writeObject 和readObject 方法 对Student类定制其串行化 4 对象序列化 实现 怎样实现对象串行化呢 首先 判断对象是否可以串行化 serializable 类必须实现了java io Serializable接口Serializable接口仅仅是一个标记 没有任何的成员变量和方法从没有实现Serializable orExternalizable 接口的类实例化来的对象是不能被串行化的创建某些OutputStream对象 然后将其封装到ObjectOutputStream对象内 此时 只需调用writeObject 即可完成对象的序列化 并将其发送给OutputStream相反的过程是 将一个InputStream封装到ObjectInputStream内 然后调用readObject 我们最后获得的是一个Object对象 必须做向下类型转换 示例 写数据 示例 读数据 示例 序列化自定义对象 示例 序列化自定义对象 示例 序列化自定义对象 三 补充 标准输入 输出中文信息读写随机文件读写 1 标准输入 输出 在java中 标准输入 是System in对象 标准输出 是System out对象 标准错误输出 是System err对象 每当main方法被执行时 就自动生成上述三个对象System out和System err已预封装成一个PrintStream对象 能直接使用 System in是一个原始的InputStream 未进行任何封装处理 必须事先封装System in 否则不能从中读取数据 例如 我们希望用readLine 每次从标准输入中读取一行输入信息 然后显示出来 就需要将System in封装到一个DataInputStream或者BufferedReader中 1 标准输入 输出 示例 1 标准输入 输出 重定向标准I O 标准I O重新导向 setIn InputStream 设置标准输入流setOut PrintStream 设置标准输出流setErr PrintStream 设置标准错误输出流如果突然要在屏幕上生成大量输出 而且滚动的速度快于人们的阅读速度 输出的重定向就显得特别有用 在一个命令行程序中 如果想重复测试一个特定的用户输入序列 输入的重定向也显得特别有价值 2 中文信息读写 InputStream OutputStream是处理8位
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高级钳工测试题(附参考答案)
- 2025年河南许昌职业病诊断医师资格考试(职业性尘肺病及其他呼吸系统疾病)模拟练习题及答案
- 2025酒后驾驶的试题及答案
- 果露酒酿造工技能巩固考核试卷及答案
- 农发行株洲市茶陵县2025秋招笔试创新题型专练及答案
- 飞机无线电设备安装调试工理论知识考核试卷及答案
- 2025年基金从业资格《证券投资基金基础知识》新版真题卷(附答案)
- 2025年岗位理论考试试题及答案
- 2025年甘肃省建筑三类安全员考试题库附答案
- 2025年二级建造师机电实务真题及答案解析(A卷)
- 建筑工程施工管理培训课件
- DB14-T 1737-2024 医疗护理员培训机构服务规范
- 物业经理聘用合同
- 理想二语自我对交际意愿的影响:二语坚毅和自信的链式中介作用
- 绳锯切割施工方案
- 职工基本医疗保险参保登记表
- 2024年社会工作者之初级社会综合能力考试题库含答案
- 学校品牌塑造校园文化的关键因素报告
- 污水厂职业病培训
- 危险化学品码头安全管理制度(3篇)
- 《电力机车构造(第2版)》课件 任务三 HXD3型电力机车空气管路系统分析
评论
0/150
提交评论