字节输出流详解:Java IO 中的 OutputStream

字节输出流详解:Java I/O 中的 OutputStream

在 Java 的 I/O 系统中,字节流是处理所有类型文件(文本、图片、视频等)的核心方式。这是因为所有文件数据在存储和传输时,都是以二进制的字节形式保存的。本文将详细讲解字节输出流的相关概念及其在 Java 中的具体使用。


1. 什么是字节流?

无论是文本、图片,还是视频,底层传输和存储的都是二进制数据。字节流是以字节为单位处理数据的输入和输出流,能够处理任意类型的数据。这意味着你可以使用字节流来传输或保存任何文件类型,包括二进制文件。

字节流可以分为两类:

  • 字节输入流(InputStream):用于从外部设备读取数据到内存中。
  • 字节输出流(OutputStream):用于将数据从内存中写出到外部设备。

本文重点介绍字节输出流的使用。


2. OutputStream 抽象类

OutputStream 是所有字节输出流类的超类,它定义了处理字节输出的基本操作。常用的几个方法如下:

  • void close():关闭流并释放系统资源。
  • void flush():刷新缓冲区,将缓冲的数据写入目的地。
  • void write(byte[] b):将字节数组中的数据写入到输出流。
  • void write(byte[] b, int off, int len):将字节数组中从 off 开始的 len 个字节写入到输出流。
  • void write(int b):将单个字节写入输出流。

在操作流的时候,一定要记得调用 close() 方法关闭流,以确保系统资源得以释放。


3. FileOutputStream

FileOutputStreamOutputStream 的一个子类,用于将数据写入文件。它提供了将字节数据写入指定文件的能力。

3.1 构造方法

FileOutputStream 提供了多种构造方法,用于创建文件输出流:

  • FileOutputStream(File file):根据 File 对象创建输出流。
  • FileOutputStream(String name):根据文件路径创建输出流。

当指定的文件不存在时,FileOutputStream 会自动创建文件;如果文件已存在,默认会清空文件内容。以下是创建文件输出流的示例代码:

public class FileOutputStreamConstructor {public static void main(String[] args) throws IOException {File file = new File("a.txt");FileOutputStream fos = new FileOutputStream(file);FileOutputStream fos2 = new FileOutputStream("b.txt");}
}
3.2 写出字节数据
  1. 写出单个字节

你可以通过 write(int b) 方法写出单个字节数据。代码如下:

public class FOSWrite {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("fos.txt");fos.write(97);  // 写出字节 'a'fos.write(98);  // 写出字节 'b'fos.write(99);  // 写出字节 'c'fos.close();}
}

执行上面的代码,文件 fos.txt 中将保存 "abc"

  1. 写出字节数组

write(byte[] b) 方法可以一次性将整个字节数组写入输出流。例如:

public class FOSWrite {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("fos.txt");byte[] bytes = "字节数组示例".getBytes();fos.write(bytes);fos.close();}
}

此时,文件内容将是 "字节数组示例"

  1. 写出指定范围的字节

使用 write(byte[] b, int off, int len) 方法,可以将字节数组的某一部分写入输出流。以下代码演示了从字节数组的指定位置写出数据:

public class FOSWrite {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("fos.txt");byte[] bytes = "abcdef".getBytes();fos.write(bytes, 2, 3);  // 从索引2开始写出3个字节,即 'cde'fos.close();}
}

最终,文件内容为 "cde"


4. 文件追加续写

默认情况下,每次创建 FileOutputStream 对象时,目标文件会被清空。如果希望在文件中追加数据而不是覆盖原有内容,可以使用带有 append 参数的构造方法:

FileOutputStream fos = new FileOutputStream("fos.txt", true);  // 追加写入

在追加模式下,新写入的数据将被添加到文件的末尾,而不会清空之前的内容。


5. 文件写入换行

在 Windows 系统中,换行是 \r\n,可以将换行符写入文件以分隔每行数据。例如:

public class FOSWrite {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("fos.txt");byte[] words = {97, 98, 99};  // 对应字符 'a', 'b', 'c'for (byte word : words) {fos.write(word);fos.write("\r\n".getBytes());  // 写出换行符}fos.close();}
}

执行结果:

a
b
c

6. flush() 方法

当你往输出流写入数据时,数据首先会被缓存在内存的缓冲区中。当缓冲区满或流关闭时,数据才会真正写入到目标文件。如果希望立即将缓冲区中的数据写出,可以使用 flush() 方法:

fos.flush();  // 强制写出缓冲区中的数据

总结

字节输出流是 Java I/O 操作中的重要组成部分,OutputStream 类提供了基本的字节写出功能,而 FileOutputStream 让我们可以轻松地将数据写入文件。在实际开发中,无论是写入文本文件、图片,还是视频,底层传输的都是二进制字节数据。

在编写涉及文件输出流的程序时,记得及时关闭流以释放资源,并根据需求选择是否使用追加模式或 flush() 方法。

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

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

相关文章

【Python-AI篇】K近邻算法(KNN)

0. 前置----机器学习流程 获取数据集数据基本处理特征工程机器学习模型评估在线服务 1. KNN算法概念 如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中大多数属于某一个类别,则该样本也属于这一个类别 1.1 KNN算法流程总…

Deepin 系统中安装Rider和Uno Platform

1、在系统的中断命令行中输入如下命令,安装.NET 8环境。 wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.debsudo dpkg -i packages-microsoft-prod.debsudo apt-get updatesudo apt-get insta…

[OpenGL]使用OpenGL实现硬阴影效果

一、简介 本文介绍了如何使用OpenGL实现硬阴影效果,并在最后给出了全部的代码。本文基于[OpenGL]渲染Shadow Map,实现硬阴影的流程如下: 首先,以光源为视角,渲染场景的深度图,将light space中的深度图存储…

反序列化漏洞浅析

Apache InLong 是开源的高性能数据集成框架&#xff0c;支持数据接入、数据同步和数据订阅&#xff0c;同时支持批处理和流处理&#xff0c;方便业务构建基于流式的数据分析、建模和应用。浅析Apache InLong < 1.12.0 JDBC反序列化漏洞&#xff08;CVE-2024-26579&#xff0…

基于微信小程序的移动学习平台的设计与实现+ssm(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…

SQL中的内连接(inner join)、外连接(left|right join、full join)以及on关键字中涉及分区筛选、null解释

一、简介 本篇幅主要介绍了&#xff1a; SQL中内连接&#xff08;inner join&#xff09;、外连接&#xff08;left join、right join、full join&#xff09;的机制;连接关键字on上涉及表分区筛选的物理执行及引擎优化&#xff1b;null在表关联时的情况与执行&#xff1b; …

【Linux】软硬链接和动静态库

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

Orleans集群及Placement设置

服务端界面使用相同的clusterid和serviceid&#xff0c;相同ip地址&#xff0c;不同网关端口号和服务端口号&#xff0c;启动两个silo服务&#xff0c;并使用MySql数据库做Silo间信息同步&#xff0c;实现集群。 silo服务启动代码如下&#xff08;从nuget下载Microsoft.Orleans…

iphone怎么删除重复的照片的新策略

Phone用户常常面临存储空间不足的问题&#xff0c;其中一个主要原因是相册中的重复照片。这些重复项不仅占用了大量的存储空间&#xff0c;还会影响设备的整体性能。本文将向您展示iphone怎么删除重复的照片的方法&#xff0c;包括一些利用工具来自动化这个过程的创新方法。 识…

C++ 的第一个程序

目录 一 . C的第一个程序 二 . 命名空间 2.1 namespace的价值 2.1 namespace 的定义 7.3 命名空间的使用 三 . C输入&输出 四 . 缺省参数 五 . 函数重载 六 . 引用 6.1 引用的概念和定义 6.2 引用的特性 6.3 引用的使用 6.4 const 引用 6.5 指针和引用的关系&…

C#开发基础:WPF和WinForms关于句柄使用的区别

1、前言 在 Windows 应用程序开发中&#xff0c;WPF&#xff08;Windows Presentation Foundation&#xff09;和 WinForms&#xff08;Windows Forms&#xff09;是两种常见的用户界面&#xff08;UI&#xff09;框架。它们各自有不同的架构和处理方式&#xff0c;其中一个显…

WPS Office手机去广高级版

工具介绍功能特点 WPS Office是使用人数最多的移动办公软件&#xff0c;独有手机阅读模式&#xff0c;字体清晰翻页流畅&#xff1b;完美支持文字&#xff0c;表格&#xff0c;演示&#xff0c;PDF等51种文档格式&#xff1b;新版本具有海量精美模版及高级功能 安装环境 [名称…

【Three.js基础学习】21.Realistic rendering

前言 课程回顾 渲染器 1.色调映射 值意在将高动态范围](HDR)值转换为低动态范围(LDR) Three.is中的色调映射实际上会伪造将LDR转换为HDR的过程&#xff0c;即使颜色不是HDR&#xff0c; 结果会产生非常逼真的渲染效果 THREE .NoToneMapping (default) 无色调映射 THREE.Linear…

TeamTalk知识点梳理一(单聊)

文章目录 db_proxy_serverdb_proxy_server reactor响应处理流程连接池redis连接池MySQL连接池 单聊消息消息如何封装&#xff1f;如何保证对端完整解析一帧消息&#xff1f;协议格式&#xff1f;单聊消息流转流程消息序号&#xff08;msg_id &#xff09;为什么使用redis生成&a…

LLaMA-Factory学习笔记(1)——采用LORA对大模型进行SFT并采用vLLM部署的全流程

该博客是我根据自己学习过程中的思考与总结来写作的&#xff0c;由于初次学习&#xff0c;可能会有错误或者不足的地方&#xff0c;望批评与指正。 1. 安装 1.1 LLaMA-Factory安装 安装可以参考官方 readme &#xff08;https://github.com/hiyouga/LLaMA-Factory/blob/main/…

Linux -- 进程初印象

目录 预备知识 切入点 PCB 看见进程 pid getpid 函数 预备知识 Linux -- 冯诺依曼体系结构&#xff08;硬件&#xff09;-CSDN博客https://blog.csdn.net/2301_76973016/article/details/143598784?spm1001.2014.3001.5501 Linux -- 操作系统&#xff08;软件&#xf…

342--358作业整理(错误 + 重点)

目录 1. 在需要运行的类中 定义 main 方法 2. this 。访问逻辑&#xff1a;先访问本类中&#xff0c;再访问父类中可以访问的成员&#xff08;不包括和本类中重名的成员&#xff09; 3. super 。访问逻辑&#xff1a;super&#xff08;父类对象&#xff09;直接访问父类及以…

Jekins篇(搭建/安装/配置)

目录 一、环境准备 1. Jenkins安装和持续集成环境配置 2. 服务器列表 3. 安装环境 Jekins 环境 4. JDK 环境 5. Maven环境 6. Git环境 方法一&#xff1a;yum安装 二、JenKins 安装 1. JenKins 访问 2. jenkins 初始化配置 三、Jenkins 配置 1. 镜像配置 四、Mave…

【Linux】冯诺依曼体系结构

目录 一、冯诺依曼体系结构二、冯诺依曼体系结构的基本组成三、关于冯诺依曼体系结构的一些问题结尾 一、冯诺依曼体系结构 冯诺依曼体系结构&#xff0c;也称为普林斯顿结构&#xff0c;是现代计算机设计的基础框架。这一体系结构由数学家冯诺依曼在20世纪40年代提出&#xf…

M1M2 MAC安装windows11 虚拟机的全过程

M1/M2 MAC安装windows11 虚拟机的全过程 这两天折腾了一下windows11 arm架构的虚拟机&#xff0c;将途中遇到的坑总结一下。 1、虚拟机软件&#xff1a;vmware fusion 13.6 或者 parallel 19 &#xff1f; 结论是&#xff1a;用parellel 19。 这两个软件都安装过&#xff0…