Java 字节流:高效处理二进制数据

news2024/10/25 12:04:50


前言

字节流是 Java I/O 系统的一部分,专门用于处理字节数据。由于所有数据在计算机中最终都以字节形式存在,这意味着字节流可以操作任何类型的数据,包括文本、图片、视频等。

Java 提供了多种字节流类,这些类继承自 InputStreamOutputStream 类。以下是一些常用的字节流类:

1.InputStream:字节输入流的抽象类,所有字节输入流都继承自此类。

  • FileInputStream:用于从文件中读取字节流。
  • ByteArrayInputStream:从字节数组中读取数据。
  • BufferedInputStream:为其他输入流提供缓冲功能,提高读取效率。
  • DataInputStream:用于读取基本数据类型(如 int、float 等)的输入流。

2.OutputStream:字节输出流的抽象类,所有字节输出流都继承自此类。

  • FileOutputStream:用于将字节流写入文件。
  • ByteArrayOutputStream:将数据写入字节数组。
  • BufferedOutputStream:为其他输出流提供缓冲功能,提高写入效率。
  • DataOutputStream:用于向输出流写入基本数据类型。

一、FileInputStream和FileOutStream

FileInputStreamFileOutputStream 是 Java 中用于处理文件的字节流类。它们分别从文件读取和向文件写入原始字节数据。

1.FileInputStream

常用构造函数

  • FileInputStream(String name):根据指定的文件名创建一个文件输入流。
  • FileInputStream(File file):根据指定的 File 对象创建一个文件输入流。

常用方法

  • int read():读取一个字节的数据,并返回一个整数(0~255),如果到达文件末尾则返回 -1。
  • int read(byte[] b):读取多个字节到字节数组中,返回实际读取的字节数。
  • void close():关闭输入流,释放与之相关的所有系统资源。
public static void main(String[] args) {
    try {
        java.io.FileInputStream fis = new java.io.FileInputStream("fileName.txt");
        int byteData;
        while((byteData = fis.read())!= -1){
            // 将字节转化为字符
            System.out.println((char) byteData);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2.FileOutStream

常用构造函数

  • FileOutputStream(String name):根据指定的文件名创建一个文件输出流。
  • FileOutputStream(File file):根据指定的 File 对象创建一个文件输出流。
  • FileOutputStream(String name, boolean append):如果 append 为 true,则在文件末尾追加内容;如果为 false,则覆盖原文件。

常用方法

  • void write(int b):将指定的字节写入文件。
  • void write(byte[] b):将字节数组中的所有字节写入文件。
  • void close():关闭输出流,释放与之相关的所有系统资源。
public static void main(String[] args) {
    try {
        java.io.FileOutputStream fos = new java.io.FileOutputStream("fileName.txt");
        String content = "Hello World";
        fos.write(content.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

二、BufferedInputStream和BufferedOutputStream

BufferedInputStreamBufferedOutputStream 是 Java 中用于处理输入和输出流的缓冲流类,它们主要用于提高读写效率,减少对底层设备的直接访问次数。

1.BufferedInputStream

BufferedInputStream 是一个输入流,使用内部缓冲区来提高读取效率。它会先将数据读取到内存缓冲区中,随后再从缓冲区中读取数据。

常用构造函数

  • BufferedInputStream(InputStream in):根据指定的输入流创建一个新的 BufferedInputStream,使用默认大小的缓冲区。

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("fileName.txt"));
  • BufferedInputStream(InputStream in, int size):根据指定的输入流和缓冲区大小创建一个新的 BufferedInputStream

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("fileName.txt"), 8192);


常用方法

  • int read():读取一个字节的数据,并返回一个整数(0~255)。如果到达流的末尾,则返回 -1。
  • int read(byte[] b):读取多个字节到字节数组中,并返回实际读取的字节数。
  • int read(byte[] b, int off, int len):从输入流中读取最多 len 个字节的数据,并将其存储在字节数组 b 中,从 off 位置开始。
  • void close():关闭输入流,释放与之相关的所有系统资源。
public static void main(String[] args) {
    try {
        BufferedInputStream  bis = new BufferedInputStream(new FileInputStream("fileName.txt"));
        int byteData;
        while((byteData = bis.read()) != -1 ){
            System.out.println((char) byteData);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

2.BufferedOuptStream

BufferedOutputStream 是一个用于提高向文件或其他输出流写入字节流效率的类。它通过使用内部缓冲区来减少实际写入操作的次数,从而提高性能。

常用构造函数

  • BufferedOutputStream(OutputStream out):根据指定的输出流创建一个新的 BufferedOutputStream,使用默认大小的缓冲区。
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("fileName.txt"));
  • BufferedOutputStream(OutputStream out, int size):根据指定的输出流和缓冲区大小创建一个新的 BufferedOutputStream

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("fileName.txt"), 8192);

常用方法

  • void write(int b):将指定的字节写入输出流。
  • void write(byte[] b):将字节数组中的所有字节写入输出流。
  • void write(byte[] b, int off, int len):将字节数组中的指定部分写入输出流,从 off 位置开始,写入 len 个字节。
  • void flush():刷新此输出流,强制将所有缓冲的输出字节写入底层输出流。
  • void close():关闭输出流,释放与之相关的所有系统资源。
public static void main(String[] args) {
    try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\lizhonghua\\Desktop\\HarmonyOS.txt"))) {
        String content = "Hello Worldfghj!";
        // 将字符串转换为字节数组并写入文件
        bos.write(content.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }

}

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

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

相关文章

Python 爬虫项目实战:爬取某云热歌榜歌曲

一、网络爬虫的定义 网络爬虫(Web Crawler),也成为网页蜘蛛或者网页机器人,是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索以及内容抓取等。 二、爬虫基本原理 1、种子URL:爬…

使用Python循环地画一个简单的爱心 - 烂漫教程

运行软件:pycharm 画一个爱心的代码: import turtle def print_love1():# 设置画笔颜色和粗细turtle.pencolor("red")turtle.pensize(6)# 绘制爱心turtle.fillcolor("pink")turtle.begin_fill()turtle.left(45)turtle.forward(100…

新鲜出炉面试题之【说说spring spring MVC spring boot的区别】

Spring MVC 和 Spring Boot 是 Spring 框架的一部分,但它们的目的和用途有所不同。下面详细阐述这两者之间的区别。 1. 概念 Spring MVC: Spring MVC 是一种基于请求-响应模式的 Web 框架,属于 Spring 框架的一部分。它提供了一种分离的方式…

【Jenkins】解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题

解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题 1. 确定物理机docker和docker compose已经安装2. 编写Jenkins Agent结点docker-compose.yaml配置文件3. 修改docker运行时文件权限4. 启动容器并验证 最近接触到一个发布产物是一个 docker镜像的项…

ORACLE 的SCHEDULER创建JOB

JOB_NAME:指定任务的名称,必选值,注意要确保指定的名称唯一。 JOB_TYPE:任务执行的操作类型,必选值,STORED_PROCEDURE:表示任务执行的是 ORACLE 存储过程。 JOB_ACTION:任务执行的操…

Pendle protocol

道阻且长,行而不辍,未来可期 我身边多是聪明的人&我一直认为我不是那个会学习的人,以往看官方文档,总有许多理解不透的地方,需要靠众多博主的白话分析才能理解,but,在学习Pendle protocol的时候&#x…

进行FMEA时需要考虑哪些历史数据?

在进行FMEA(Failure Modes and Effects Analysis,即故障模式与影响分析)时,历史数据扮演着至关重要的角色。这些数据不仅为分析提供了坚实的基础,还帮助团队更准确地预测潜在故障模式,评估其影响&#xff0…

uni-app 开发微信小程序,实现图片预览和保存

1.使用 uni.previewImage() 预览图片 1.1 图片列表 1.2 预览 1.2.1 样式无法调整 1.2.2 微信小程序不支持预览本地文件路径图片(图片上传到小程序的临时文件存储或云服务存储) 1.3 无法绑定 longpress"saveImage(item)" 长按保存图片事件 …

C++,STL 044(24.10.24)

内容 1.set容器的构造函数。 2.set容器的赋值操作。 运行代码 #include <iostream> #include <set>using namespace std;void printSet(set<int> &s) {for (set<int>::iterator it s.begin(); it ! s.end(); it){cout << *it << &…

充电宝目前什么牌子的质量好耐用?盘点2024年五款高性价充电宝!

充电宝目前什么牌子的质量好耐用&#xff1f;这是许多人在选购充电宝时最为关心的问题。随着移动设备的普及和技术的进步&#xff0c;充电宝已经成为日常生活中不可或缺的伴侣。为了帮助大家在众多品牌中做出明智的选择&#xff0c;我特地盘点了2024年五款具有高性价比的充电宝…

跨境科技公司如何借助 NocoBase 升级内部系统并实现外部业务增长?

关于政元软件 深圳市政元软件有限公司&#xff0c;作为国家级高新技术企业和专精特新企业&#xff0c;自 2006 年成立以来&#xff0c;一直走在跨境企业服务的前沿。近年来&#xff0c;政元软件将人工智能技术与跨境业务场景结合&#xff0c;为客户提供创新的解决方案&#xff…

数据结构——树、二叉树和森林间的转换

前言 介绍 &#x1f343;数据结构专区&#xff1a;数据结构 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》129~130页 &#x1f308;每一个清晨&#xff0c;都是世界对你说的最温柔的早安&#xff1a;ૢ(≧▽≦)و✨ 目录 前言 1、基础知识 2…

现场总是发生急停,很可能是PLC和设置间网络中断

如果你的现场总是发生急停&#xff0c;很可能是PLC和设置间网络中断&#xff0c;本文用一个真实案例告诉你问题背后的原因和解决方法&#xff01; 这是一台生产汽车配件的机器&#xff0c;使用1500F的控制器连接机器人控制器&#xff0c;现场装置总会莫名其妙的发生急停故障。…

Linux运维_搭建smb服务

Samba&#xff08;SMB&#xff09;是一个开源软件&#xff0c;允许Linux和Unix系统与Windows系统共享文件和打印机。以下是一些关于Samba和SMB的基本信息和操作步骤&#xff1a; Samba 和 SMB 基本概念 Samba&#xff1a;实现了SMB&#xff08;Server Message Block&#xff…

程序员中后期,靠什么和其他人拉开差距?

有人说程序员是吃青春饭的&#xff0c;到了35岁会被淘汰。但和身边几十位程序员聊完后&#xff0c;发现实际情况不尽如此&#xff01; 工作两三年的时候&#xff0c;有些程序员技术优势明显&#xff0c;看起来职业前途很好&#xff1b;工作四五年后&#xff0c;该学的技术都熟…

Vue学习记录之十七 css中样式穿透及新特征介绍

一、scoped原理 在vue页面的css中,有一个设置为scoped,使用以后dom的节点会出现下面的规则。其实我们打完包就是一个html页面,如果不做处理,将会导致css混乱。 给HTML的DOM节点加一个不重复data属性(形如:data-v-123)来表示他的唯一性在每句css选择器的末尾(编译后的生成的…

Java每日面试题(前端Vue拓展)(day20)

目录 Vue是什么&#xff1f;v-if 和 v-show的区别&#xff1f;watch与compute的区别&#xff1f;使用过哪些前端组件&#xff1f;Vue父子组件如何进行交互&#xff1f;Vue的生命周期v-for指令中的key属性有什么用&#xff1f; Vue是什么&#xff1f; Vue是一个渐进式 JavaScrip…

平时实战知识(混合版)map.keyset+stream+maven打包

为这个博主点赞!!!!!!!!!!!!!!!! Java stream 使用样例_哪些类可以使用stream-CSDN博客 IDEA使用maven命令打包_idea 打包maven-CSDN博客

博客搭建之路:hexo搜索引擎收录

文章目录 hexo搜索引擎收录以百度为例 hexo搜索引擎收录 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 写博客的目的肯定不是就只有自己能看到&#xff0c;想让更多的人看到就需要可以让搜索引擎来收录对应的文章。hexo支持生成站点地图sitemap 在hexo下的_config.yml中配置站点…

【D3.js in Action 3 精译_035】4.1 D3 中的坐标轴的创建(下篇):坐标轴与轴标签的具体实现

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…