【Java面向对象】二进制I/O

文章目录

  • 1.二进制文件
  • 2.二进制 I/O 类
    • 2.1 FileInputStream 和 FileOutputStream
    • 2.2 FilterInputStream和 FilterOutputStream
    • 2.3 DatalnputStream 和 DataOutputStream
    • 2.4 BufferedInputStream 和 BufferedOutputStream
    • 2.5 ObjectInputStream 和 ObjectOutputStream
  • 2.6 Serializable接口
    • 2.7 序列化数组
  • 3.随机访问文件

1.二进制文件

文件可以分为文本或者二进制的。可以使用文本编辑器,比如 Windows 下的记事本或者 UNIX 下的 vi 编辑器,进行处理(读取、创建或者修改)的文件称为文本文件。所有其他的文件称为二进制文件。
不能使用文本编辑器来读取二进制文件一它们被设计为使用程序来读取。例如,Java 源程序存储在文本文件中,可以使用文本编辑器读取,而 Java 类文件是二进制文件,由 Java 虚拟机读取。

计算机并不区分二进制文件和文本文件。所有的文件都是以二进制形式来存储的,因此,从本质上说,所有的文件都是二进制文件。文本 I/O 建立在二进制 I/O 的基础之上,它能提供一层抽象,用于字符的编码和解码。
对于文本I/O,编码和解码是自动进行的。在写入字符时,Java 虚拟机会将 Unicode 码转化为文件特定的编码,而在读取字符时,将文件特定的编码转化为 Unicode 码。
二进制 I/O 不需要转化。如果使用二进制 I/O 向 文件写入一个数值,就是将内存中的那个值复制到文件中。
由于二进制 I/O 不需要编码和解码,所以,它比文本 I/O 效率高。二进制文件与主机的编码方案无关,因此,它是可移植的。任何机器上的 Java 程序都可以读取 Java 程序所创建的二进制文件。这就是为什么 Java 的类文件存储为二进制文件的原因。Java 类文件可以在任何具有 Java 虚拟机的机器上运行。

一般来说,对于文本编辑器或文本输出程序创建的文件,应该使用文本输入来读取,对于 Java 二进制输出程序创建的文件,应该使用二进制输入来读取。

2.二进制 I/O 类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1 FileInputStream 和 FileOutputStream

几乎所有的 I/O 类中的方法都会抛出异常java.io.IOException。因此,必须在方法中声明会抛出java.io.工OException异常,或者将代码放到 try-catch 块中。

import java.oi.*;
public class TestFileStream{public static void main(String[] args){try{FileOutputStream output = new FileOutputStream("temp.txt");}{for(int i = 0;i<10;i++)output.write(i);}try{FileInputStream input = new FileInputStream("temp.txt");}{int value;while((value=input.read())!=1)System.out.print(value + " ");}	}
}

2.2 FilterInputStream和 FilterOutputStream

过滤器数据流 ( filterstream) 是为某种目的过滤字节的数据流。基本字节输入流提供的读取方法 read 只能用来读取字节。
如果要读取整数值、双精度值或字符串,那就需要一个过滤器类来包装字节输入流。使用过滤器类就可以读取整数值、双精度值和字符串,而不是
字节或字符。
FilterlnputStream 类和 FilterOutputStream 类是用于过滤数据的基类。需要处理基本数值类型时,就使用 DatalnputStream 类和 DataOutputStream 类来过滤字节。

2.3 DatalnputStream 和 DataOutputStream

DatalnputStream 从数据流读取字节,并且将它们转换为合适的基本类型值或字符串。
DatabutputStream 将基本类型的值或字符串转换为字节, 并且将字节输出到流。
在这里插入图片描述
在这里插入图片描述
如果到达 Inputstream 的末尾之后还继续从中读取数据,就会产生 EOFException 异常。这个异常可以用来检查是否已经到达文件末尾。

import java.io.*;
public class Write{public static void main(String[] args){try{try(new DataOutputStream(new FileOutputStream("test.dat"))){output.writeDouble(4.5);}try(DatalnputStream input =new DataInputStream(new Fi1eInputStream("test .dat"))){while(true)System.out.println(input.readDouble());}}catch(EOFException ex){System.out.println("All data were read");}catch(IOException ex){ex.printStackTrace();}}
}

2.4 BufferedInputStream 和 BufferedOutputStream

BufferedlnputStream 类和 BufferedOutputStream 类可以通过减少磁盘读写次数来提高输入和输出的速度。使用 BufferdlnputStream 时,磁盘上的整块数据一次性地读入内存的缓冲区中。然后从缓冲区中将单个数据传递到程序中。

DataOutputStream output = new DataOutputStream(new BufferedOutputStream (new FileOutputStream("temp.dat"))) ;
DatalnputStream input = new DataInputStream(new BufferedInputStream(new FileInputStream("temp.dat")))

2.5 ObjectInputStream 和 ObjectOutputStream

DatalnputStream 类和 DataOutputStream 类可以实现基本数据类型与字符串的输入和输出。而 ObjectlnputStream 类和 ObjectOutputStream 类除了可以 实现基本数据 类型与字符串的输入 和输出之外,还可以实现对象的输入和输出。
由于 ObjectlnputStream 类和ObjectOutputStream 类包含 DatalnputStream 类 和 DataOutputStream 类 的所有 功能,所以,完全可以用 ObjectInputStream 类和 ObjectOutputStream 类代替 DatalnputStream 类和DataOutputStream类。

import java.io.*;
public class Test{public static void main(String[] args)throws IOException{try{ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("o.dat"));// 可以改为// ObjectOutputStream output = new ObjectOutputStream(new BufferedOutputStream(new Fi1eOutputstream ( "o.dat")));}{output.writeUTF("John");output.writeDouble(85.5);output.writeObject(new java.util.Date());}try{ObjectInputStream input = new ObjectInputStream(FileInoutStream("o.dat"));}{String name = input.readUTF();double score = input.readDouble();java.util.Date = (java.util.Date)(input.readObject());}}
}

2.6 Serializable接口

并不是每一个对象都可以写到输出流。可以写到输出流中的对象称为可序列化的( serializable)。因为可序列化的对象是 java.io.Serializable 接口的实例,所以, 可序列化对象的类必须实现 Serializable 接口
Java 提供一个内在机制自动完成写对象的过程。这个过程称为对象序列化 ( object serialization), 它是在 ObjectOutputStream中实现的。与此相反,读取对象的过程称作对象反序列化 ( object deserialization), 它是在Objectinputstream 类中实现的。
当存储一个可序列化对象时,会对该对象的类进行编码。编码包括类名、类的签名、对象实例变量的值以及该对象引用的任何其他对象的闭包,但是不存储对象静态变量的值。

如果一个对象是 Serializable 的 实例,但它包含了不能序列化的实例数据域,那么可以序列化这个对象吗?答案是否定的。为了使该对象是可序列化的,需要给这些数据域加上关键字 transient, 告诉 Java 虚拟机将对象写入对象流时忽略这些数据域

class A implements java.io.Serializable{// 只需序列 化变量 因为 v2 是一个静态变量,所以没有序列化。因为 v3 标记为 transient, 所以也没有序列化private int v1;private static double v2;private transient B v3 = new B();
}

如果一个对象不止一次写入对象流,会存储对象的多份副本吗?答案是不会。第一次写入一个对象时,就会为它创建一个序列号。Java 虚拟机将对象的所有内容和序列号一起写入对象流。以后每次存储时,如果再写入相同的对象,就只存储序列号。读出这些对
象时,它们的引用相同,因为在内存中实际上存储只是一个对象。

2.7 序列化数组

如果数组中的所有元素都是可序列化的,这个数组就是可序列化的。整个数组可以用writeObject 方法存入文件,随后用 readobject 方法恢复。

int[] numbers = {1, 2, 3, 4, 5};
String[] strings = {"John0", "Susan" ,
try (ObjectOutputstream output = newObjectOutputStream(new FlieOutputstream( "array.dat", true));
){output.writeObject(numbers);output.writeObject(strings);
}try (Objectinputstream input =
new ObjectInputStream(new Fl1elnputStream("array.dat")) ;
) {int[] newNumbers = (int[ ] ) (input.readObject()) ;Stringf] newStrings = (String[]) (input .readObject()) ;for(int i = 0; i < newNumbers.1ength; i++)System.out.print(newNumbers[1] + " ");
System.out.println() ;for(int i = 0; i < newStrings.1ength; i++)System.out .print(newStr1ngs[i ] + " ") ;
}

3.随机访问文件

到现在为止,所使用的所有流都是只读的或只写的这些流称为顺序 (sequential) 流。使用顺序流打开的文件称为顺序访问文件。顺序访问文件的内容不能更新。然而, 经常需要修改文件。Java 提供RandomAccessFile 类,允许在文件的任意位置上进行读写。使用 RandomAccessFile类打开的文件称为随机访问文件。
当创建一个 RandomAccessFile 时, 可以指定两种模式 ( “r” 或 “rw”) 之一。模式 "r"表明这个数据流是只读的. 模式 ”rw” 表明这个数据流既允许读也允许写。

RandomAccessFile raf = new RandomAccessFile("test.dat","rw");

如果文件 test.dat 已经存在,则创建 raf 以便访问这个文件;如果 test.dat 不存在,则创建一个名为 test.dat 的新文件,再创建 raf 来访问这个新文件。
在这里插入图片描述
随机访问文件是由字节序列组成的。一个称为文件指针 (file pointer) 的特殊标记定位这些字节中的某个位置。文件的读写操作就是在文件指针所指的位置上进行的。打开文件时,文件指针置于文件的起始位置。在文件中进行读写数据后,文件指针就会向前移到下一个数据项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防御保护课-防火墙接口配置实验

一、实验拓扑 &#xff08;我做实验用的图如下&#xff09; 二、实验要求 1.防火墙向下使用子接口分别对应生产区和办公区 2.所有分区设备可以ping通网关 三、实验思路 配IP&#xff1b; 划分vlan并配置vlan&#xff1b; 配置路由和安全策略。 四、实验配置 1、画图并…

开源模型应用落地-FastAPI-助力模型交互-进阶篇-RequestDataclasses(三)

一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理&#xff0c;使应用程序能够处理各种不同的请求场景&#xff0c;提高应用程序的灵活性和可扩展性。 在数据验证和转换方面&#xff0c;高级用法提供了更精细和准确的控制&#…

【Linux】进程间通信之-- 共享内存与信号量的介绍(下)

前言 上一篇&#xff0c;我们由进程间通信&#xff0c;引入并讲述了管道、匿名管道和命名管道&#xff0c;本节&#xff0c;将继续学习进程间通信的另一种方式之&#xff0c;共享内存。还要学习几个系统调用接口&#xff0c;并演示两个进程通过共享内存来进行通信。。。 目录 1…

工业控制:CANOpen(控制器局域网络)协议快速学习

文章目录 背景协议介绍CAN总线协议CANOpen协议介绍CANOpen诞生背景CANOpen的对象字典 CANOpen的服务数据对象&#xff08;SDO&#xff09; 参考附录问题CAN总线竞争原理在CAN协议中&#xff0c;帧中的ID是发送者的ID还是接收者的ID&#xff1f; 背景 目前很多CANOpen介绍的文章…

循环机制(event loop)之宏任务和微任务

一、前言 js任务分为同步任务和异步任务&#xff0c;异步任务又分为宏任务和微任务&#xff0c;其中异步任务属于耗时的任务。 二、宏任务和微任务有哪些&#xff1f; 宏任务&#xff1a;整体代码script、setTimeout、setInterval、setImmediate&#xff08;Node.js&#xff…

【ARM】SMMU系统虚拟化整理

目录 1.MMU的基本介绍 1.1 特点梳理 2.功能 DVM interface PTW interface 2.1 操作流程 2.1.1 StreamID 2.1.2 安全状态&#xff1a; 2.1.3 HUM 2.1.4 可配置的操作特性 Outstanding transactions per TBU QoS 仲裁 2.2 Cache结构 2.2.1 Micro TLB 2.2.2 Macro…

第四周:机器学习笔记

第四周学习周报 摘要Abstract机器学习任务攻略1.loss on training data1.1 training data的loss过大怎么办&#xff1f;1.2 training data的loss小&#xff0c;但是testing data loss大怎么办&#xff1f; 2. 如何选择一个中最好的模型&#xff1f;2.1 Cross Validation&#x…

知名在线市场 Etsy 允许在其平台上销售 AI 艺术品,但有条件限制|TodayAI

近日&#xff0c;以手工和复古商品著称的在线市场 Etsy 宣布&#xff0c;将允许在其平台上销售 AI 生成的艺术品。这一举措引发了广泛关注和争议。尽管 Etsy 正在接受 AI 艺术的潮流&#xff0c;但平台对这一类商品的销售设置了一些限制。 根据 Etsy 新发布的政策&#xff0c;…

mysql存储引擎和备份

索引 事务 存储引擎 概念&#xff1a;存储引擎&#xff0c;就是一种数据库存储数据的机制&#xff0c;索引的技巧&#xff0c;锁定水平。 存储引擎。存储的方式和存储的格式。 存储引擎也属于mysql当中的组件&#xff0c;实际上操作的&#xff0c;执行的就是数据的读写I/O。…

华为OD机试2024年C卷D卷 - 构成指定长度字符串的个数/字符串拼接(Java)

华为OD机试&#xff08;C卷D卷&#xff09;2024真题目录 题目描述&#xff1a;构成指定长度字符串的个数 (本题分值200) 给定 M&#xff08;0 < M ≤ 30&#xff09;个字符&#xff08;a-z&#xff09;&#xff0c;从中取出任意字符&#xff08;每个字符只能用一次&#x…

科普文:银行信贷系统概叙

信贷业务流程 资金需求者提交申请&#xff1a;资金需求者通过不同渠道&#xff08;如APP、网站、门店等&#xff09;提交贷款申请。 系统交互完成审批&#xff1a;系统通过自动化和人工相结合的方式&#xff0c;对贷款申请进行初步筛选和审批。 系统交互完成策略判断&#xf…

rsync文件远程同步

目录 一、什么是rsync远程同步 二、实操rsync远程文件同步 1、配置rsync同步源 2、客户端部署 3、增量备份​编辑 4、删除文件 5、如何实现免交互登录 6、crontab rsync 实现定时同步 7、使用ssh实现rsync数据同步【☆】 如何使用ssh免交互实现数据同步&#xff1f;…

Golang | Leetcode Golang题解之第260题只出现一次的数字III

题目&#xff1a; 题解&#xff1a; func singleNumber(nums []int) []int {xorSum : 0for _, num : range nums {xorSum ^ num}lsb : xorSum & -xorSumtype1, type2 : 0, 0for _, num : range nums {if num&lsb > 0 {type1 ^ num} else {type2 ^ num}}return []in…

【深度学习入门篇 ⑨】循环神经网络实战

【&#x1f34a;易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

【一刷《剑指Offer》】面试题 48:不能被继承的类

《剑指Offer》对应内容&#xff1a; 可参考&#xff1a; 【C】继承 -- 详解_c,两个派生类继承一个基类,声明对象的时候用基类的对象。-CSDN博客

每日OJ_牛客_WY33 计算糖果

目录 牛客_WY33 计算糖果 解析代码 牛客_WY33 计算糖果 计算糖果_牛客题霸_牛客网 解析代码 A - B aB - C bA B cB C d 这道题目的实质是&#xff1a;判断三元一次方程组是否有解及求解&#xff0c; 13可以得到A(ac)/2&#xff1b;4-2可以得到C(d-b)/2; 24可以得到B2…

WebGSI地图切片|栅格地图切片原理|地图矢量切片原理

介绍 图栅格切片是WebGIS中使用的一种新技术&#xff0c;通过地图栅格切片可以有效缩短服务器的地图生成时间和地图传输时间&#xff0c;提高系统的响应速度。 地图切片是在多个比例尺下配置地图&#xff0c;预先将每个比例尺下的地图绘制成小图片&#xff0c;保存到服务器上一…

Python 爬虫实战----3(实力展现)

实战&#xff1a;获取豆瓣电影top250的电影名字 1.获取url&#xff1a;打开网站按发f12&#xff0c;点击网络&#xff0c;刷新找到第一个截取url和User-Agent。 2.请求爬取数据 mport requests import fake_useragent from lxml import etree import re #UA head {"User…

Android AutoSize屏幕适配:适配不同屏幕大小的尺寸,让我们无需去建立多个尺寸资源文件

目录 AutoSize是什么 AutoSize如何使用 一、AndroidautoSize是什么 在开发产品的时候&#xff0c;我们会遇到各种各样尺寸的屏幕&#xff0c;如果只使用一种尺寸去定义控件、文字的大小&#xff0c;那么到时候改起来就头皮发麻。以前使用dime的各种类库&#xff0c;文件太多…

Spark调优特殊case- Task倾斜

首先我们观察下上面的stage5, Task MaxTime2.4Min, 但是stage5的整体耗时竟然可以达到55Min, 其实分区1000&#xff0c; 300个executor&#xff0c; 按照最大的TaskTime2.4Min来估算所有Task运行完成时间, 那么时间应该是- 2.4Min * 3 2.4Min 9.6Min 也就是最慢也就跑10分钟就…