《Java黑皮书基础篇第10版》 第17章【笔记】

news2024/11/17 8:46:24

第十七章 二进制I/O

17.1 引言

文件可以不严谨的分类为文本文件和二进制文件。文本文件指的是可以用文件编辑器进行查看和修改的,二进制文件则不可以使用文本编辑器查看和修改。

例如,Test.java文件储存在文本文件中,因此可以用文本编辑器读取,但是Test.class则是二进制文件,由java虚拟机读取

Java提供了许多实现文件输入/输出的类。这些类可以分为文本I/O类和二进制I/O类。在12.11节中我们已经介绍过文本I/O类,因此本章开始介绍二进制I/O的类

17.2 在Java中如何处理文本I/O

使用Scanner类读取文本数据,使用PrintWriter类写入文本数据

17.3 文本I/O与二进制I/O

计算机并不区分二进制文件与文本文件,所有的文件都是以二进制形式来存储的,二进制I/O不涉及编码和解码,因此比文本I/O更加高效。

17.4 二进制I/O类

InputStream类是二进制输入类的根类,而OutputStream类是二进制输出类的根类

二进制I/O类中的所有方法都声明为抛出java.io.IOException或其子类

在这里插入图片描述

17.4.1 FilelnputStream和FileOutputStream

FilelnputStream类用来从文件中读取数据,FileOutputStream类用来向文件中写入数据

import java.io.*;

public class Test {
  public static void main(String[] args) throws java.io.IOException {
	  FileOutputStream output = new FileOutputStream("Exercise17_01.txt");
	  int randomInt = 65;
	  output.write(randomInt);
	  output.close();
	  
	  FileInputStream input = new FileInputStream("Exercise17_01.txt");
	  System.out.print(input.read());
	  input.close();
  }
}

write()方法接收一个byte类型的参数,且这个参数忽略符号位,因此,参数的范围是0-255(1个byte是8个bit,因此就是8个0或1,最大能表示255)

如果输入的参数是0-255之间的数字,就会将这个数字储存进文件,如果输入的参数是负数,或者大于255,这个参数就会被截断,只保留后8位

如果现在你去看Exercise17_01.txt文件本身,就会发现文件内容是A,这是因为,虽然各种二进制类的方法本身不涉及编码和解码,但是文本编辑器进行了ASCII解码,让用户看到解码后的对应字符

需要注意的是,用于进行二进制数据输入输出的类,并不会将数据按照文本的形式保存到文件中,有时可能会出现乱码,因此,我们有的时候确实写入了数据,只不过由于编译器的编码方案等局限,无法直接从文本编辑器查看内容

17.4.2 FilterlnputStream和FilterOutputStream

过滤器数据流可以用来读取某些特殊的字符(串),如基本数据类型和字符串

17.4.3 DatalnputStream和DataOutputStream

FilterlnputStream和FilterOutputStream是过滤数据的基类,例如,如果需要处理基本数值类型,就需要用到DatalnputStream类和DataOutputStream类

具体一点来说,我们刚刚学过,write()方法如果输入超出了范围0-255,就会被截断,为了避免截断,我们引入本节内容

如果文件读取到了末尾再次尝试读取,read()方法会返回-1,readInt()等方法就会发生EOFException异常

不同的数据写入时有自己特殊的编码方式,读取数据的类型取决于写入数据的类型,例如,如果一个文件不是由writeInt()创建的,直接读取readInt()可能会有异常

读取数据的顺序需要按照写入数据的顺序来进行,如果先写入了一个writeUTF,再写入了一个writeDouble,读取的时候也必须先读取writeUTF,再读取writeDouble,直接读取writeDouble会报异常

17.4.4 BufferedlnputStream和BufferedOutputStream

BufferedlnputStream类和BufferedOutputStream类可以通过减少磁盘读写次数来提高输人和输出的速度

17.5 示例学习:复制文件

17.6 对象 I/O

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

写入/读取流中的对象需要是可序列化的,因为可序列化的对象是java.io.Serializable接口的实例,所以可序列化对象的类必须实现Serializable接口(基本类型在进行序列化时会被自动拆箱/装箱并通过)

如果一个对象是Serializable的实例,但它包含了非序列化的实例数据域,对象就不是可序列化的,需要给这些数据域加上关键字transient, 告诉Java虚拟机将对象写入对象流时忽略这些数据域

17.7 随机访问文件

Java提供了RandomAccessFile类,允许从文件的任何位置进行数据的读写

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

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

相关文章

MapReduce程序基本架构

MapReduce程序是以(键/值)对的形式来处理数据的,即可以通过以下的形式来表示: map: (K1,V1) ➞ list(K2,V2) reduce: (K2,list(V2)) ➞ list(K3,V3) 不令人惊奇的是,这是一种超越一般数据的数据流表示形式。在本文中…

使用PyMC进行时间序列分层建模

在统计建模领域,理解总体趋势的同时解释群体差异的一个强大方法是分层(或多层)建模。这种方法允许参数随组而变化,并捕获组内和组间的变化。在时间序列数据中,这些特定于组的参数可以表示不同组随时间的不同模式。 今天,我们将深…

ood的5C解题法(1)----管理类面试对象设计

管理类 概念 可以模拟/代替管理员日常工作的系统 下面用停车场系统做演示 答题流程 Clarify What:除题目中的名词外,从管理的名词考虑 parking lot是什么类型的?如果楼有多层,停车位也是多层,则parking lot->pa…

Windows Server 2019 OVF, updated Jun 2023 (sysin) - VMware 虚拟机模板

Windows Server 2019 OVF, updated Jun 2023 (sysin) - VMware 虚拟机模板 2023 年 6 月版本更新,现在自动运行 sysprep,支持 ESXi Host Client 部署 请访问原文链接:https://sysin.org/blog/windows-server-2019-ovf/,查看最新…

5、产品经理的工作职责OR主要工作技能和工具

1、产品经理的工作职责 我们通过一个案例来了解产品经理的工作职责。 老板让你给他点餐,你应该怎么做?你需要考虑哪一些方面的问题? 例如:你预算多少,预算是十块钱还是100块还是1000块。有没有忌口,口味…

【MYSQL篇】Update语句原理详解

文章目录 前言缓冲池Buffer PoolInnoDB 内存结构redo logundo logBinlog 总结 前言 前面的文章我们已经对MySQL的查询语句的执行流程进行了说明,感兴趣的可以去看看: 【MySQL篇】Select语句原理详解 本篇文章我们来聊聊 MySQL更新语句的执行原理。更新…

Win7系统提示Windows Defender无法扫描选定的文件解决方法

Win7 64位系统提示“Windows Defender无法扫描选定的文件”怎么办呢?使用Windows Defender扫描文件,结果弹出如下图窗口,该怎么解决呢,参考下文,一起来解决Win7系统提示“Windows Defender无法扫描选定的文件”的解决方法。 原因分析: 这是因为开启Defender扫描压…

java的序列化注解Serial、序列化版本号serialVersionUID

例如,jdk源码NTLMException类的定义,其中涉及到了序列化注解Serial和序列化版本号字段serialVersionUID: 序列化注解java.io.Serial: 序列化注解java.io.Serial是在javaSE-14版本引入的。通常注解实现了序列化类的序列化相关的函…

【JUC进阶】02. volatile关键字

目录 1、回顾JMM 1.1、可见性(Visibility) 1.2、原子性(Atomicity) 1.3、有序性(Ordering) 2、volatile 2.1、保证可见性 2.2、不保证原子性 2.3、防止指令重排 2.4、什么时候使用volatile 3、小…

微服务中「组件」集成

有品:There is no silver bullet; 一、简介 在微服务工程的技术选型中,会涉及到很多组件的集成,最常用包括:缓存、消息队列、搜索、定时任务、存储等几个方面; 如果工程是单服务,对于集成组件…

有趣的数学 关于自然常数e

一、e的值 自然常数(也称欧拉数)e是数学中最重要的数字之一。 2.7182818284590452353602874713527...... 二、从复利理解e 设想你在一家银行有一个银行账户,该银行付给你一个慷慨的利息年利率12%,一年计一次复利.你将一笔初始存款…

测试(二)

1.软件测试的生命周期 需求分析→测试计划→ 测试设计→ 测试开发→ 测试执行→ 测试评估 2.如何描述一个Bug 3.Bug的优先级 1、Blocker(崩溃): 阻碍开发或测试工作的问题;造成系统崩溃、死机、死循环,导致数据库数…

Windows Server 2016 OVF, updated Jun 2023 (sysin) - VMware 虚拟机模板

2023 年 6 月版本更新,现在自动运行 sysprep,支持 ESXi Host Client 部署 请访问原文链接:https://sysin.org/blog/windows-server-2016-ovf/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org…

Kubernetes 纯理论 贼干篇

Kubernetes理论 docker 容器引擎 docker compose 单机编排工具 docker swarm Docker容器多机编排工具,实现Docker容器的集群管理调度的工具 k8s 容器多机编排工具,占据80%以上的市场份额 mesos marathon mesos:分布式资管管理框架,可以对…

2019年全国硕士研究生入学统一考试管理类专业学位联考写作试题

写作:第56~57小题,共65分。其中论证有效性分析30分,论说文35分。 56.论证有效性分析 分析下述论述中存在的缺陷和漏洞,选择若干要点,写一篇600字左右的文章,对论证的有效性进行分析和评论。(论…

Linux终端与进程的关系 ( 1 ) -【Linux通信架构系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the…

案例:从定性原因分析上升到定量原因分析

在定量原因分析时,主要是有四种定量思考的方法: 1、数据的居中趋势与离散程度分析:均值、标准差 2、 80-20分析:在所有的构成成分中,哪个成分占比最大 3、数据的相关性分析:是否存在强相关 4、敏感性分…

[进阶]Java:文件字符输入流、文件字符输出流

问:字节流读取中文输出可能会存在什么问题? 会乱码。或者内存溢出。 读取中文输出,哪个流更合适,为什么? 字符流更合适,最小单位是按照单个字符读取的。 代码演示如下: public class FileR…

[C++]vs2019运行c++报错:错误 C1075 “{”: 未找到匹配令牌

源码是从git拉下来的,但是我并没有改任何东西,结果报错超过100个,这个很明显不是代码问题,最后发现需要把LF换成CRLF,修改方法很简单,就是VS2019打开源代码右下角切换即可。如图 错误原因就是github下载的源…

【MySQL】不就是MySQL——多表查询

前言 嗨!小伙伴们大家好呀,忙碌的一周就要开始!在此之前我们学习的MySQL数据库的各种操作都是在一张表之中,今天我们学习要对多张表进行相关操作,相比较于单一的表来说,多张表操作相对复杂一些,…