【深入理解Java IO流0x03】解读Java最基本的IO流之字节流InputStream、OutputStream

在开始前,我们再来回顾一下这张图:
image.png
本篇博客主要为大家讲解字节流。
我们都知道,一切文件(文本、视频、图片)的数据都是以二进制的形式存储的,传输时也是。所以,字节流可以传输任意类型的文件数据

1. 字节输入流InputStream

java.io.InputStream是字节输入流的超类。来看一下它的抽象方法:

  • close() :关闭此输入流并释放与此流相关的系统资源。
  • int read(): 从输入流读取数据的下一个字节。
  • read(byte[] b): 该方法返回的 int 值代表的是读取了多少个字节,读到几个返回几个,读取不到返回-1
  • available():返回输入流中可以读取的字节数

2. 字节输入流FileInputStream

InputStream有很多子类,FileInputStream就是实现子类中最简单的一个。看名字就知道是文件输入流,用于将数据从文件中读取数据。

2.1 构造方法

  • FileInputStream(String name):创建一个 FileInputStream 对象,并打开指定名称的文件进行读取。文件名由 name 参数指定。如果文件不存在,将会抛出 FileNotFoundException 异常。
  • FileInputStream(File file):创建一个 FileInputStream 对象,并打开指定的 File 对象表示的文件进行读取。

实战一下:

@Test
public void test005() throws IOException {FileInputStream fis = new FileInputStream("test.txt");int data;while((data=fis.read())!=-1){System.out.println((char)data);}fis.close();
}

2.2 常用方法

一、读取字节
read()方法会读取一个字节并且返回其正数表示,如果到达文件末尾,返回-1。读取时发生错误会抛IOException异常。
实战代码:

@Test
public void test005() throws IOException {FileInputStream fis = new FileInputStream("test.txt");int data;while((data=fis.read())!=-1){System.out.println((char)data);}fis.close();
}

二、读取字节数组
read(byte[] b)方法会从输入流中最多读取b.length个字节,并将它们存储到缓冲区数组 b 中。
实战代码:

@Test
public void test005() throws IOException {File file = new File("test.txt");FileInputStream fis = new FileInputStream(file);byte[] buf = new byte[1024];int count;while((count=fis.read(buf))!=-1){System.out.println(new String(buf,0,count));}fis.close();
}

3. 字节输出流OutputStream

java.io.OutputStream是字节输出流的超类。来看一下它的抽象方法:

  • close():关闭此输出流并释放与此流相关联的系统资源。
  • flush():刷新此输出流并强制缓冲区的字节被写入到目的地。
  • write(byte[] b):将 b.length 个字节从指定的字节数组写入此输出流。
  • write(byte[] b, int off, int len):从指定的字节数组写入 len 字节到此输出流,从偏移量 off开始。 也就是说从off个字节数开始一直到len个字节结束。

4. 字节输出流FileOutputStream

OutputStream有很多子类,最简单的一个子类就是 FileOutputStream 。看名字就知道是文件输出流,用于将数据写入到文件。

4.1 构造方法

  • FileOutputStream(String name):创建一个 FileOutputStream 对象,并打开指定名称的文件进行写入。文件名由 name 参数指定。如果文件不存在,则创建一个新文件;如果文件已经存在,则覆盖原有文件
  • FileOutputStream(String name, boolean append):参数append表示是否为"追加"模式,默认为false不追加也就是清空原有数据。
  • FileOutputStream(File file):创建一个 FileOutputStream 对象,并打开指定的 File 对象表示的文件进行写入。

实战一把:

@Test
public void test006() {FileOutputStream fos = null;try {fos = new FileOutputStream("test2.txt");fos.write("i love cola.你好世界!".getBytes());} catch (IOException e) {throw new RuntimeException(e);} finally {try {fos.close();} catch (IOException e) {throw new RuntimeException(e);}}
}

4.2 常用方法

一、写入字节
write(int b) 方法,每次可以写入一个字节,代码如下:

// 使用文件名称创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");     
// 写出数据
fos.write(97); // 第1个字节,等效于'a'  因为a的ASCII码为97
fos.write(98); // 第2个字节
fos.write(99); // 第3个字节
// 关闭资源
fos.close();

当使用 write(int b) 方法写出一个字节时,参数 b 表示要写出的字节的整数值。由于一个字节只有8位,因此参数 b 的取值范围应该在 0 到 255 之间,超出这个范围的值将会被截断。例如,如果参数 b 的值为 -1,那么它会被截断为 255,如果参数 b 的值为 256,那么它会被截断为 0。
在将参数 b 写入输出流中时,write(int b) 方法只会将参数 b 的低8位写入,而忽略高24位。这是因为在 Java 中,整型类型(包括 byte、short、int、long)在内存中以二进制补码形式表示。当将一个整型值传递给 write(int b) 方法时,方法会将该值转换为 byte 类型,只保留二进制补码的低8位,而忽略高24位。
例如,如果要写出的整数为 0x12345678,它的二进制补码表示为 0001 0010 0011 0100 0101 0110 0111 1000。当使用 write(int b) 方法写出该整数时,只会将二进制补码的低8位 0111 1000 写出,而忽略高24位 0001 0010 0011 0100 0101 0110。这就是参数 b 的高24位被忽略的原因。
0111 1000 是一个8位的二进制数,它对应的十进制数是 120,对应的 ASCII 码字符是小写字母 “x”。在 ASCII 码表中,小写字母 “x” 的十进制 ASCII 码值为 120。因此,如果使用 write(int b) 方法写出一个字节值为 0x78(十进制为 120),那么写出的结果就是小写字母 “x”。
验证一下:

FileOutputStream fos = null;
try {fos = new FileOutputStream("example.txt");fos.write(120);fos.write('x');fos.write(0x12345678);
} catch (IOException e) {e.printStackTrace();
} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}
}

最终文本中:
image.png
二、写入字节数组
write(byte[] b),代码示例:

// 使用文件名称创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");     
// 字符串转换为字节数组
byte[] b = "你好世界~Hello World".getBytes();
// 写入字节数组数据
fos.write(b);
// 关闭资源
fos.close();

另外再补充一下,在 Windows 系统中,换行符号是\r\n,而在Linux系统中换行则是\n

5. 字节流实战

实战环节,要求通过字节流复制图片。
实现很简单,就是通过字节输入流读取图片,再用字节输出流输出到指定位置即可。

@Test
public void test007() throws IOException{FileInputStream fis = new FileInputStream("snoopy.png");FileOutputStream fos = new FileOutputStream("snoopy_copy.png");byte[] buf = new byte[1024];int count=0;while((count=fis.read(buf))!=-1){fos.write(buf,0,count);}fis.close();fos.close();
}

上面的代码创建了一个 FileInputStream 对象以读取原始图片文件,并创建了一个 FileOutputStream 对象以写入复制后的图片文件。然后,使用 while 循环逐个读取原始图片文件中的字节,并将其写入复制后的图片文件中。最后,关闭输入流和输出流释放资源。

6. 小结

InputStream是字节输入流的抽象类,它定义了读取字节数据的方法,如read()read(byte[] b)read(byte[] b, int off, int len)等。OutputStream是字节输出流的抽象类,它定义了写入字节数据的方法,如 write(int b)write(byte[] b)write(byte[] b, int off, int len) 等。这两个抽象类是字节流的基础。
FileInputStream是从文件中读取字节数据的流,它继承自InputStreamFileOutputStream是将字节数据写入文件的流,它继承自OutputStream。这两个类是字节流最常用的实现类之一。

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

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

相关文章

2.动态库与静态库

1.库的制作 库文件是计算机上的一类文件,可以将库文件看做是一种代码仓库。它提供给使用者一些可以直接拿来用的变量,函数或类。库是一种特殊的程序,但是库是不能单独运行的。 库文件有两种:静态库和动态库 静态库: GCC进行链接…

Jackson 各种注解使用示例

参考资料 Jackson使い方メモ 目录 一. JsonIgnore二. JsonIgnoreProperties三. JsonProperty3.1 作用于entity属性上,指定json对象属性名3.2 作用于entity方法上,指定json对象属性名 四. JsonFormat4.1 日期格式化4.2 数字格式化4.3 枚举类返回code 五.…

Open CASCADE学习|平面上的PCurve

曲面上的曲线PCurve,字面上理解即为参数曲线(Parametric Curve)。在几何建模中,PCurve通常被描述为附加在参数曲面之间公共边上的数据结构。从更具体的定义来看,当给定一个曲面方程,并且其参数u和v是另一个参数t的函数时&#xff…

Redis数据库的简介、部署及常用命令

关系数据库与非关系型数据 关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。sQL语句(标准数据查询语言)就是一种基于关系型数据库的语言&#xff0c…

HarmonyOS NEXT应用开发之Environment:设备环境查询

开发者如果需要应用程序运行的设备的环境参数,以此来作出不同的场景判断,比如多语言,暗黑模式等,需要用到Environment设备环境查询。 Environment是ArkUI框架在应用程序启动时创建的单例对象。它为AppStorage提供了一系列描述应用…

wireshark抓包新手使用教程

Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括: 1、Wireshark软件下载和安装以及Wireshark主界面介绍。 2、WireShark简单抓包示例。通过该例子学…

20万就想买智能驾驶汽车?!我给你找到了三款车

文 | AUTO芯球 作者 | 雷歌 我都不敢相信,智能驾驶的车型已经这么便宜啦! 一年多前,我一个前同事大冤种,还另掏3万多买某个造车新势力品牌的智驾包呢。 现在动不动就全给你标配了。 近的就说刚刚发布的小米SU7标准版&#xf…

962: 括号匹配问题

【学习版】 【C语言】 【C】 #include<iostream>class MyStack { public:struct Node {char val;Node* prev;Node* next;Node(char x) :val(x), prev(NULL),next(NULL) {};};MyStack() {base new Node(0);top base;}bool empty() {return top base;}void push(int …

Mysql底层原理五:如何设计、用好索引

1.索引的代价 空间上的代价 时间上的代价 每次对表中的数据进⾏增、删、改操作时&#xff0c;都需要去修改各个B树索引。⽽且我们讲过&#xff0c;B树每层节点都是按照索引列的值从⼩到⼤的顺序排序⽽组成了双 向链表。不论是叶⼦节点中的记录&#xff0c;还是内节点中的记录&a…

vue 中使 date/time/datetime 类型的 input 支持 placeholder 方法

一般在开发时&#xff0c;设置了 date/time/datetime 等类型的 input 属性 placeholder 提示文本时&#xff0c; 发现实际展示中却并不生效&#xff0c;如图&#xff1a; 处理后效果如图&#xff1a; 处理逻辑 判断表单项未设置值时&#xff0c;则设置其伪类样式&#xff0c;文…

深度学习基础之一:机器学习

文章目录 深度学习基本概念(Basic concepts of deep learning)机器学习典型任务机器学习分类 模型训练的基本概念基本名词机器学习任务流程模型训练详细流程正、反向传播学习率Batch size激活函数激活函数 sigmoid 损失函数MSE & M交叉熵损失 优化器优化器 — 梯度下降优化…

IVS模型解释

核心思路 【Implied volatility surface predictability: The case of commodity markets】 半参数化模型&#xff1a;利用各种参数(或者因子)对隐含波动率进行降维&#xff08;静态参数化因子模型&#xff09;&#xff0c;对参数化因子的时间序列进行间接的建模 基于非对称…

未来的技术发展趋势

文章目录 前言一、人工智能技术势必聚焦安全能力二、单云环境逐渐让位于多云环境三、后量子密码或将在美大范围普及总结前言 2023 年,与网络空间安全息息相关的人工智能等技术发展迅猛,新的信息安全时代已然拉开大幕。在目睹了 ChatGPT、“星链”和量子通信等技术展现出的巨…

RocketMQ笔记(七)SpringBoot整合RocketMQ发送事务消息

目录 一、简介1.1、流程图1.2、事务消息流程介绍 二、Maven依赖三、生产者3.1、application配置3.2、员工表3.3、实体3.4、持久层3.5、监听器 四、测试4.1、普通消息4.2、事务消息4.2.1、消费者4.2.2、正常提交4.2.3、异常提交 五、其他5.1、接口说明5.2、checkLocalTransactio…

解决Xshell连接Linux虚拟机速度慢问题

我们频繁更换网络环境时&#xff0c;可能会发现xshell连接Linux虚拟机的速度变得很慢 为什么呢&#xff1f; 因为ssh的服务端在连接时会自动检测dns环境是否一致导致的 我们把它修改为不检测即可 修改文件位置&#xff1a; vi /etc/ssh/sshd_config 把 #UseDNS yes 修改…

有关介绍CVPR‘2024工作《持续学习的无干扰低秩适应》正式实施

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2024.04.03 Last edited: 2024.04.03 代码&#xff1a;GitHub - liangyanshuo/InfLoRA&#xff1a;CVPR2024 工作 Interference-Free Low-Rank A…

LeetCode-热题100:240. 搜索二维矩阵 II

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a; matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[…

2014最新AI智能系统ChatGPT网站源码+Midjourney绘画网站源码+搭建部署教程文档

一、文章前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持…

图书馆自助借书机怎么借书

图书馆自助借书机借书流程如下&#xff1a; 1. 找到图书馆自助借书机&#xff0c;在机器上选择借书功能。 2. 输入自己的借书卡号或者身份证号码&#xff0c;如果是第一次借书&#xff0c;可能需要进行注册。 3. 输入图书的条形码号码&#xff0c;可以通过扫描条形码或者手动输…

Hybrid混合开发 和 Android平台JSBridge的原理

书接上篇&#xff1a;移动端研发技术的进化历程 纯原生开发主要面临动态化和开发成本两个问题&#xff0c;而针对这两个问题&#xff0c;诞生了一些跨平台的动态化框架。 针对原生开发面临的问题&#xff0c;业界一直都在努力寻找好的解决方案&#xff0c;而时至今日&#xf…