版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第19章 二进制I/O,2,引言,在文本文件中存储的数据是以我们能读懂的方式表示的。而在二进制文件中存储的数据使用二进制形式表示的。我们是读不懂二进制文件的,因为它们是为了让程序来读取而设计的。例如java源文件存储在文本文件中,可以使用文本编译器来阅读,但是,java类存储在二进制文件中,可以被java虚拟机阅读。二进制文件的优势在于它的处理效率比文本文件高。,3,学习目标,了解在java中如何处理 I/O (19.2) 区分文本 I/O 与二进制I/O 的不同(19.3). 使用 和 来读写字节(19.4.1) 使用DataInputStream或DataOutputStream 来读
2、写基本类 型值和字符串(19.4.3). 使用ObjectOutputStream 和 ObjectInputStream实现对象的存储与恢复,理解如何序列化对象以及什么样的对象才可以序列化(19.6). 实现Serializable 接口是对象可序列化(19.6.1). 序列化数组(19.6.2). 使用RandomAccessFile 对文件进行读写 (19.7).,4,在java中如何处理输入/输出,File对象封装文件或路径属性,但是不包含从/向文件读/写数据的方法。为了进行I/O操作,需要使用正确的java I/O类创建对象。这些对象包含从/向文件中读/写数据的方法。,PrintWr
3、iter output = new PrintWriter(temp.txt); output.println(Java 101); output.close();,Scanner input = new Scanner(new File(temp.txt); System.out.println(input.nextLine();,5,文本I/O与二进制I/O,尽管从技术上不怎么准确和正确,但是可以做这样的一个比喻,文本文件是由字符序列化构成的,而二进制文件是由位序列构成的。例如,十进制整数199在文本文件中是以三个字符序列199来存储的,而二进制文件中它是以byte类型的值C7存储的,因为
4、十进制数199等价的十六进制数是C7(199=12*16+7)。,6,二进制I/O,在文本I/O中自动进行编码和解码。在写入一个字符时,java虚拟机会将统一码转换为文件指定的编码。而在读取字符时,将文件指定的编码转化为统一码。 二进制I/O不需要转化。如果使用二进制I/O向文件写入一个数值,就是将内存中的确切值复制到文件中。,7,二进制I/O类,8,The value returned is a byte as an int type.,InputStream,9,The value is a byte as an int type.,OutputStream,10,类和类,类和类是为了从/
5、向文件读取/写入字节。它们所有方法都是从InputStream类和OutputStream类继承的。,11,为了构造一个 对象,使用下面的方法: public (String ) public () 如果试图为一个不存在的文件创建对象,将会发生java.io.异常。,12,要构造一个 对象, 使用以下的构造方法: public (String ) public () public (String , boolean append) public (, boolean append) 如果文件不存在,就创建一个新的文件。如果文件已经存在,前两个构造方法将删除文件中的当前内容。为了既保留当前的内容
6、又可以给文件追加新数据,将最后两个构造方法中的参数append设置为true。,Test,Run,13,FilterInputStream/FilterOutputStream,过滤器数据流,是为了某种目的过滤器字节的数据流。基本字节输入流提供的读取方法read只能用来读取字节。如果要读取的整数值,双精度值或字符串,那就需要一个过滤器类包装字节输入流。使用过滤器类就可以读取整数,双精度值和字符串,而不是字节和字符。filterinputstream和filteroutputstream是过滤数据的基类。需要处理基本数值类型时,就使用datainputstream和DataOutputStrea
7、m过滤字节。,14,DataInputStream/DataOutputStream,DataInputStream从数据流读取字节,并将它们转换为正确的基本类型或字符串。,DataOutputStream 将基本类型的值或字符串转换为字节,并且将字节输出到数据流。,15,DataInputStream,DataInputStream 类继承 FilterInputStream 并且实现了接口DataInput。,16,DataOutputStream,DataOutputStream 继承了 FilterOutputStream 并且实现了接口 DataOutput。,17,二进制I/O中的
8、字符与字符串,一个统一码由两个字节构成。writeChar(char c)方法将字符c的统一码写入输出流。writeChar(String s)方法将字符串s中所有字符统一码写到输出流中。,什么是UTF-8? 为什么有 UTF-8? UTF-8是一种编码方案,它允许系统和统一码及ASCII码一起操作的编码方案。大多数操作系统是使用ASCII码,java使用统一码。ASCII码字符集是统一码字符集的子集。由于许多应用程序只需要ASCII码字符集,所以将8位的ASCII码转化为16位的统一码是很浪费的。UTF-8的修改版方案分别使用1字节,2字节或3字节来存储字符。如果字符的编码值小于或等于Ox7
9、F就将字符编码为一个字节,如果编码值大于Ox7F就将该字符编码为两个字节,如果该字符的编码值大于Ox7FF就将该字符编码为三个字节。,18,使用DataInputStream和DataOutputStream 类,数据流用于对存在创建的输入/输出流进行包装,以便在原始流中过滤数据。可以使用下面的构造方法来创建它们。 public DataInputStream(InputStream instream) public DataOutputStream(OutputStream outstream) 下面给出的语句会创建数据流。第一条语句为文件in.dat创建一个输入流; 而第二条语句为文件ou
10、t.dat创建一个输出流. DataInputStream infile = new DataInputStream(new (in.dat); DataOutputStream outfile = new DataOutputStream(new (out.dat);,TestDataStream,Run,19,检测文件的末尾,如果到达InputStream的末尾之后还继续从中读取数据,就会发生 EOFException 异常。如何检测是否到达文件末尾。 可以使用input.available()检测,input.available() = 0 表明一个文件结束。,顺序和格式,应该按存储的顺
11、序和格式读取文件中的数据。例如:学生的姓名是用writeUTF方法以UTF-8格式写入,所以,读取时必须使用readUTF方法。,20,BufferedInputStream和BufferedOutputStream,Using buffers to speed up I/O,BufferedInputStream/BufferedOutputStream没有新方法,所有的BufferedInputStream/BufferedOutputStream 的方法都是从 InputStream/OutputStream 继承的.,21,构造BufferedInputStream/BufferedO
12、utputStream,/ Create a BufferedInputStream public BufferedInputStream(InputStream in) public BufferedInputStream(InputStream in, int bufferSize) / Create a BufferedOutputStream public BufferedOutputStream(OutputStream out) public BufferedOutputStream(OutputStreamr out, int bufferSize),22,对象的输入输出,Dat
13、aInputStream/DataOutputStream可以实现基本数据类型与字符串的输入输出。而ObjectInputStream/ObjectOutputStream除了可以实现基本数据类型与字符串的输入输出之外,还可以实现对象的输入输出。,23,ObjectInputStream,ObjectInputStream 继承 InputStream 并实现接口ObjectInput 与 ObjectStreamConstants.,24,ObjectOutputStream,ObjectOutputStream 继承 OutputStream 并实现接口ObjectOutput and O
14、bjectStreamConstants.,25,使用对象数据流,可以使用下面的ObjectInputStream/ObjectOutputStream 构造方法包装任何一个 InputStream/OutputStream: / Create an ObjectInputStream public ObjectInputStream(InputStream in) / Create an ObjectOutputStream public ObjectOutputStream(OutputStream out),TestObjectOutputStream,Run,TestObjectInp
15、utStream,Run,26,可序列化 Serializable 接口,并不是每个对象都可以写到数据流。可以写入输出流中的对象称为可序列化。因为可序列化的对象是 java.io.Serializable 接口的实例.。所以,可序列化类必须实现 Serializable接口。 Serializable 接口是一种标记性接口。因为它没有方法,所以,不需要在类中为实现Serializable接口增加额外的代码。实现这个接口可以启动java的序列化机制,自动完成存储对象和数组的过程。,27,关键字 transient,如果一个对象是可序列化的实例,但它含有非序列化的数据域,那么可以序列化这个对象吗?答案是否定的。为了使该对象是可序列化的,需要给这些数据域加上关键字transient ,告诉java虚拟机将对象写入对象流时忽略这些数据域。,28,关键字 transient,考虑下面的类: public class Foo implements java.io.Serializable private int v1; private static double v2; private transient A v3 = new A(); class A / A is not serializable 当FOO类的一个对象进行序列化时,只需序列化变量v1。因为v2是一个静态变量,所以没有序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国人民财产保险股份有限公司秦皇岛市分公司招聘笔试模拟试题及答案解析
- 2025 经纬网在航空导航中的应用课件
- 做自信的人 课件- 2025-2026学年统编版道德与法治七年级下册
- 2026广西防城港市港口生态环境局招聘2人笔试备考题库及答案解析
- 2026年南平建阳选调乡镇初中、小学幼儿园教师到城区学校任教18人笔试备考试题及答案解析
- 2026云南德宏州瑞丽市人民法院招聘聘用制书记员2人笔试模拟试题及答案解析
- 2026年深圳市烟草专卖局(公司)应届高校毕业生招聘44人笔试备考试题及答案解析
- 2026年度集团公司董事会工作报告汇报总结国有企业
- 《Illustrator平面设计应用教程(Illustrator 2021)》课件 项目6 文本的编辑
- 2025年青少年网络保护培训
- 2025-2026学年苏科版(新教材)小学信息科技六年级下册教学计划及进度表
- 2026年包头钢铁职业技术学院单招职业技能测试题库完整答案详解
- XX中学2026年春季学期庆祝“三八”国际妇女节女教职工座谈会讲话
- 2026年内蒙古建筑职业技术学院单招职业技能测试题库附答案解析
- (2026春新版本) 苏教版科学三年级下册全册教学设计
- 2025下半年湖南中学教师资格笔试《综合素质》真题及答案解析
- GB/T 16271-2025钢丝绳吊索插编索扣
- 清华大学考生自述
- 《空气动力学与飞行原理》空气动力学-课件
- 明朝诗、文、词、曲、民歌课件
- 比例尺的意义 详细版课件
评论
0/150
提交评论