【IO流】FileOutputStream 字节输出流

FileOutputStream 字节输出流

    • 1. 概述
    • 2. 作用
    • 3. 书写步骤
    • 4. 构造方法
    • 5. 换行写
    • 6. 续写
    • 7. 注意事项

1. 概述

FileOutputStream 是 Java 中用于向文件写入字节数据的输出流类。它用于创建一个文件输出流,该流用于将数据写入文件。

  1. 功能FileOutputStream 可以用来写入字节数据到文件中。它支持将字节、字节数组或部分字节数组写入到文件中。

  2. 创建流:要使用 FileOutputStream,需要指定要写入的文件路径。可以使用 new FileOutputStream(new File("文件路径")) 创建一个文件输出流对象。

  3. 写入数据:通过调用 write(byte[] b)write(int b)write(byte[] b, int off, int len) 等方法,可以将字节数据写入文件。

  4. 关闭流:写入完成后,需要调用 close() 方法关闭流,释放资源。

  5. 异常处理:在使用 FileOutputStream 时,需要注意处理可能抛出的 IOException 异常,以确保文件操作的可靠性。

2. 作用

FileOutputStream 的主要作用是将字节数据写入文件。

  1. 文件写入:使用 FileOutputStream 可以将字节数据写入文件。可以写入字节、字节数组或部分字节数组,实现对文件内容的修改或追加。

  2. 创建文件:如果指定的文件不存在,FileOutputStream 会自动创建该文件,并将数据写入其中。如果文件已存在,则会先清空文件内容,再写入新的数据。

  3. 文件追加:除了覆盖文件内容外,FileOutputStream 还可以在已有文件的末尾追加新的字节数据,而不会删除原有内容。这对于日志文件、数据文件等需要不断增加内容的场景非常有用。

  4. 二进制文件处理FileOutputStream 可以处理二进制文件,如图像、音频、视频文件等。通过向文件写入原始的字节数据,能够保持文件的二进制结构不变。

  5. 文件流关闭:在写入完成后,调用 close() 方法关闭 FileOutputStream 流,确保文件操作的正确性和资源的释放。

3. 书写步骤

  • 实现步骤:

    1. 创建对象

    2. 写出数据

    3. 释放资源

  • FileOutputStream书写细节

    • ① 创建字节输出流对象
      • 细节1:参数是字符串表示的路径或者File对象都是可以的

      • 细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

      • 细节3:如果文件已经存在,则会清空文件

    • ② 写数据
      • 细节: write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
    • ③ 释放资源
      • 细节:每次使用完流之后都要释放资源(解除了资源的占用)
  • 代码示例
    实现需求:写出一段文字到本地文件。(暂时不写中文)

    package text.IOStream.FileOutputStream.FileOutputStream01;import java.io.FileOutputStream;
    import java.io.IOException;/*
    字节输出流:FileOutputStream
    实现需求:写出一段文字到本地文件。(暂时不写中文)实现步骤:1.创建对象2.写出数据3.释放资源FileOutputStream书写细节
    ① 创建字节输出流对象细节1:参数是字符串表示的路径或者File对象都是可以的细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的细节3:如果文件已经存在,则会清空文件
    ②写数据细节: write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
    ③ 释放资源细节:每次使用完流之后都要释放资源(解除了资源的占用)*/
    public class FileOutputStream01 {public static void main(String[] args) throws IOException {//1.创建对象//写出 输出流 OutputStream//本地文件 FileFileOutputStream fos = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream01\\a.txt");// 2.写出数据fos.write(99);//3.释放资源fos.close();}
    }
  • 输出结果
    在这里插入图片描述

4. 构造方法

FileOutputStream写数据的三种方式:

方法名称说明
void write(int b)一次写一个字节数据
void write(byte[] b)一次写一个字节数组数据
void write(byte[] b, int off, int len)一次写一个字节数组的部分数据
  • 细节:
    1. void write(byte[lb,int off,int len):一次写一个字节数组的部分数据
    • 参数一: 数组

    • 参数二:起始索引

    • 参数三:个数

  • 代码示例
    package text.IOStream.FileOutputStream.FileOutputStream02;import java.io.FileOutputStream;
    import java.io.IOException;/*FileOutputStream写数据的三种方式:| 方法名称                            | 说明                         |
    | ----------------------------------- | ---------------------------- |
    | void write(int b)                   | 一次写一个字节数据           |
    | void write(byte[]b)                 | 一次写一个字节数组数据       |
    | void write(byte[lb,int off,int len) | 一次写一个字节数组的部分数据 |细节:1.void write(byte[lb,int off,int len):一次写一个字节数组的部分数据参数一:数组参数二:起始索引参数三:个数*/
    public class FileOutputStream02 {public static void main(String[] args) throws IOException {//1.void write(int b) :一次写一个字节数据System.out.println("=============1.void write(int b) :一次写一个字节数据=============");//创建对象FileOutputStream fos1 = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream02\\a.txt");//写出数据fos1.write(97);//释放资源fos1.close();System.out.println();//2.void write(byte[]b):一次写一个字节数组数据System.out.println("=============2.void write(byte[]b):一次写一个字节数组数据=============");//创建对象FileOutputStream fos2 = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream02\\b.txt");//写出数据byte[] bytes1 = {97, 98, 99, 100, 101, 102};fos2.write(bytes1);//释放资源fos2.close();System.out.println();//3.void write(byte[lb,int off,int len):一次写一个字节数组的部分数据System.out.println("=============3.void write(byte[lb,int off,int len):一次写一个字节数组的部分数据=============");//创建对象FileOutputStream fos3 = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream02\\c.txt");//写出数据byte[] bytes2 = {97, 98, 99, 100, 101, 102};fos3.write(bytes2, 0, 3);//释放资源fos3.close();}
    }
  • 输出结果
    • 1.void write(int b) :一次写一个字节数据
      在这里插入图片描述
      在这里插入图片描述

    • 2.void write(byte[]b):一次写一个字节数组数据
      在这里插入图片描述
      在这里插入图片描述

    • 3.void write(byte[lb,int off,int len):一次写一个字节数组的部分数据
      在这里插入图片描述
      在这里插入图片描述

5. 换行写

换行写:再次写出一个换行符就可以了

windows: \r\n
Linux: \n
Mac: \r

  • 细节:

    • 在windows操作系统当中,java对回车换行进行了优化。
    • 虽然完整的是\r\n,但是我们写其中一个\r或者\n,java也可以实现换行,因为java在底层会补全。
  • 建议:不要省略,还是写全了。

  • 代码示例
    在a.txt文件中写道:

      love (换行)you
    
    package text.IOStream.FileOutputStream.FileOutputStream03;import java.io.FileOutputStream;
    import java.io.IOException;/*换行写换行写:再次写出一个换行符就可以了windows:\r\nLinux:\nMac: \r细节:在windows操作系统当中,java对回车换行进行了优化。虽然完整的是\r\n,但是我们写其中一个\r或者\n,java也可以实现换行,因为java在底层会补全。
    建议:不要省略,还是写全了。练习:在a.txt文件中写道:love (换行)you*/
    public class FileOutputStream03 {public static void main(String[] args) throws IOException {//创建对象FileOutputStream fos = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream03\\a.txt");//写出数据String str1 = "love";//将字符串转换成字节数组byte[] bytes1 = str1.getBytes();fos.write(bytes1);String str2 = "\r\n";byte[] bytes2 = str2.getBytes();fos.write(bytes2);String str3 = "you";byte[] bytes3 = str3.getBytes();fos.write(bytes3);//释放资源fos.close();}
    }
  • 输出结果
    在这里插入图片描述

6. 续写

续写:如果想要续写,打开续写开关即可

  • 开关位置:创建对象的第二个参数append

    public FileOutputStream(String name, boolean append)

    • 默认false:表示关闭续写,此时创建对象会清空文件
    • 手动传递true;表示打开续写,此时创建对象不会清空文件
  • 代码示例

    package text.IOStream.FileOutputStream.FileOutputStream04;import java.io.FileOutputStream;
    import java.io.IOException;/*续写
    续写:
    如果想要续写,打开续写开关即可开关位置:创建对象的第二个参数appendpublic FileOutputStream(String name, boolean append)默认false:表示关闭续写,此时创建对象会清空文件手动传递true;表示打开续写,此时创建对象不会清空文件*/
    public class FileOutputStream04 {public static void main(String[] args) throws IOException {//创建对象FileOutputStream fos = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream03\\a.txt", true);//写出数据String str = "XX";//将字符串转换成字节数组byte[] bytes = str.getBytes();fos.write(bytes);//释放资源fos.close();}
    }
  • 输出结果
    在这里插入图片描述

7. 注意事项

  1. 数据丢失:使用 FileOutputStream 写入数据时,如果数据未被刷新到磁盘或未调用 close 方法关闭流,有可能造成数据丢失。因此,在写入完数据后,务必调用 flush 方法将数据刷新到磁盘并调用 close 方法关闭流。

  2. 异常处理:在使用 FileOutputStream 进行文件写入操作时,可能会抛出 IOException 异常,因此需要在适当的地方进行异常处理,以避免程序崩溃或数据丢失。

  3. 文件权限:在写入文件时,需要注意文件的权限问题。确保当前用户有足够的权限来进行文件写入操作,否则会导致写入失败。

  4. 文件覆盖:使用 FileOutputStream 写入文件时,默认会覆盖原有文件内容。如果不希望覆盖文件内容,可以通过构造函数中的参数来指定是否追加数据而不是覆盖。

  5. 数据编码FileOutputStream 写入的是字节数据,如果需要写入字符数据或其他类型的数据,需要进行适当的编码转换,以确保数据的正确性。

  6. 资源释放:在完成文件写入操作后,一定要及时关闭 FileOutputStream 流,释放资源,避免资源泄露和程序性能问题。

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

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

相关文章

RocketMQ快速入门: linux安装RocketMQ并配置开机自启

0. 引言 针对rocketMQ的学习,首当其冲的就是正确安装服务,所以我们今天来看linux下如何安装rocketmq及其控制台服务,并设置各个服务的开机自启 1. 安装 因为rocketmq是基于java的,所以需要大家提前安装好java环境,这…

云计算基础-存储虚拟化(深信服aSAN分布式存储)

什么是存储虚拟化 分布式存储是利用虚拟化技术 “池化”集群存储卷内通用X86服务器中的本地硬盘,实现服务器存储资源的统一整合、管理及调度,最终向上层提供NFS、ISCSI存储接口,供虚拟机根据自身的存储需求自由分配使用资源池中的存储空间。…

EasyUI动态加载组件

要实现如下的效果,在表格中显示进度条 主要是需要再次初始化组件,借用ChatGPT的意思是: 在许多 JavaScript UI 框架中,包括 EasyUI,在动态地创建或插入新的 DOM 元素后,通常需要手动初始化相关的组件或特性…

每日OJ题_算法_递归④力扣24. 两两交换链表中的节点

目录 ④力扣24. 两两交换链表中的节点 解析代码 ④力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即…

入门OpenCV:图像阈值处理

基本概念 图像阈值是一种简单、高效的图像分割方法,目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值,根据比较结果来确定每个像素点的状态(前景或背景)。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。…

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java)

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java) 比赛链接:Codeforces Round 926 (Div. 2) B题传送门:B. Sasha and the Drawing 题目:B. Sasha and the Drawing Example input 3 4 3 3 3 10 3 9 4 7 7 11 2 3output 2 …

人工智能学习与实训笔记(四):神经网络之NLP基础—词向量

人工智能专栏文章汇总:人工智能学习专栏文章汇总-CSDN博客 本篇目录 四、自然语言处理 4.1 词向量 (Word Embedding) 4.1.1 词向量的生成过程 4.1.2 word2vec介绍 4.1.3 word2vec:skip-gram算法的实现 4.2 句向量 - 情感分析 4.2.1 LSTM (Long S…

【Python】测量WAV文件播放时长

问题 windows播放WAV音频文件,一般使用API函数,如PlaySound。实际使用发现,从调用PlaySound到实际开始播放存在200ms以上的延时,在游戏编程中音效实时性是个需要解决的问题。 本文主要讨论,windows播放WAV文件的衍生…

MySQL 基础知识(九)之视图

目录 1 视图的介绍 2 视图算法 3 创建视图 4 查看视图结构 5 修改视图 6 删除视图 7 参考文档 1 视图的介绍 视图是一张并不存储数据的虚拟表,其本质是根据 SQL 语句动态查询数据库中的数据。数据库中只存放了视图的定义,通过 SQL 语句使用视图时…

C语言-生成随机数

目录 1 rand()函数 2 srand()函数 1 rand()函数 int rand (void); rand函数可以生成一个随机整数,范围在 0 ~ RAND_MAX,RAND_MAX的值是0x7fff,换算成十进制是32767。 但是我们发现使用此函数生成随机数,每次生成的随机数都是一…

【C深度解剖】前置++与后置++

简介:本系列博客为C深度解剖系列内容,以某个点为中心进行相关详细拓展 适宜人群:已大体了解C语法同学 作者留言:本博客相关内容如需转载请注明出处,本人学疏才浅,难免存在些许错误,望留言指正 作…

挑战杯 YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快,YOLOv6还没用熟YOLOv7就来了,如果有同学的毕设项目想用上最新的技术,不妨看看学长的这篇文章,学长带大家简单的…