「解析文件流,Java之FileOutputStream助您轻松操作文件!」

news2024/12/26 10:42:08

在这里插入图片描述


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

文章目录

  • 前言
  • 摘要
  • FileOutputStream
    • 1. Java IO包基础
    • 2. FileOutputStream类介绍
      • 2.1 创建FileOutputStream对象
      • 2.2 写入数据
      • 2.3 关闭FileOutputStream
    • 3. 常用方法
    • 应用场景
    • 优缺点分析
      • 优点:
      • 缺点:
    • 4. 示例代码
    • 5. 测试用例
      • 5.1 用例代码
      • 5.2 代码解析
      • 5.3 测试结果
    • 6. 源码分析
      • 6.1 构造函数
      • 6.2 write() 方法
      • 6.3 其他方法
      • 6.4 源码截图
    • 全文小结
  • 总结
    • 附录源码
  • ☀️建议/推荐你
  • 📣关于我

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~

在这里插入图片描述

前言

  Java是一门广泛应用于开发各种应用程序的编程语言,也广泛应用于文件操作方面,其中FileOutputStream是Java IO包中常用的类之一。本文将介绍如何使用FileOutputStream类来操作文件流,以方便开发人员更加轻松地读写文件。

摘要

  本文主要介绍了Java中文件操作的基本知识和FileOutputStream类的使用方法。在介绍FileOutputStream类之前,我们先了解了Java IO包中的一些基本的类,比如InputStream、OutputStream、File、FileReader等等。在具体的介绍中,我们详细讲解了如何使用FileOutputStream来写入文件,并给出了相应的示例代码。最后,我们还介绍了一些FileOutputStream类的常用方法。

FileOutputStream

1. Java IO包基础

  Java IO包是Java编程语言中用于读写数据的API。它提供了一个非常简单和易于使用的接口,以帮助我们轻松地读写文件。在Java IO包中,常用的类有InputStreamOutputStreamReaderWriter,它们都是抽象类。另外,Java IO包中还包含了一些具体的类,如File、FileInputStream、FileOutputStream等。

2. FileOutputStream类介绍

  FileOutputStream类是Java IO包中用于写入文件的类。通过FileOutputStream类,我们可以将数据写入到文件中。

2.1 创建FileOutputStream对象

FileOutputStream fos = new FileOutputStream("example.txt");

2.2 写入数据

String data = "Hello, world!";
byte[] bytes = data.getBytes();
fos.write(bytes);

2.3 关闭FileOutputStream

写入完成后,需要关闭FileOutputStream,以释放资源。

fos.close();

3. 常用方法

常用的方法有:

  • write(byte[] b): 将字节数组写入数据流。
  • write(byte[] b, int off, int len): 将字节数组中的一部分写入数据流。
  • flush(): 刷新数据流。
  • close(): 关闭输出流。

应用场景

  FileOutputStream是Java IO库中的一个类,它用于写入二进制数据到文件中。以下是FileOutputStream的应用场景分析:

  1. 文件写入:FileOutputStream被广泛用于将数据写入文件,特别是在需要将二进制数据写入文件中时。
  2. 网络传输:FileOutputStream也可以用来将二进制数据写入网络流中传输,一些常见的网络编程框架使用FileOutputStream来实现数据的写入。
  3. 数据库存储:将二进制数据写入数据库中也是FileOutputStream的应用之一。

优缺点分析

优点:

  1. 速度快:FileOutputStream是Java IO库中最快的输出流之一,因为它不会像BufferedOutputStream一样缓存数据,直接写入。
  2. 支持二进制数据:FileOutputStream可以写入任何类型的数据,包括二进制数据。
  3. 灵活性高:FileOutputStream可以通过多种方式进行数据写入,例如:按字节写入、按字符写入等。

缺点:

  1. 不支持缓存:FileOutputStream不支持数据缓存,这意味着每次写入操作都需要打开文件并写入数据,增加了文件I/O的开销。
  2. 不能在文件中追加数据:FileOutputStream只会覆盖文件中原有的数据,不能在文件最后面追加数据。
  3. 不支持高级的字符处理:FileOutputStream只能处理字节数据而不能处理字符数据,必须通过其他类如OutputStreamWriter进行处理。

  综上所述,FileOutputStream是Java IO库中功能强大的输出流之一,可用于高效地将二进制数据写入文件、网络流或数据库中。但是,它不支持缓存和追加数据等高级功能。因此,在选择输出流时要权衡其优势和劣势。

4. 示例代码

下面是一个示例代码,展示了如何使用FileOutputStream将数据写入文件中。

import java.io.FileOutputStream;
import java.io.IOException;

public class FileWriterExample {
    
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("example.txt");
        String data = "Hello, world!";
        byte[] bytes = data.getBytes();
        fos.write(bytes);
        fos.close();
    }
}

测试运行结果如下:

在这里插入图片描述

5. 测试用例

5.1 用例代码

  我们可以编写一些测试用例来确保代码的正确性。下面是一个简单的测试用例,展示了如何验证代码是否按预期工作。

package com.example.javase.io.fileOutputStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Author bug菌
 * @Date 2023-10-15 19:40
 */
public class FileOutputStreamTest {

    public static void main(String[] args) throws IOException {
        String data = "Hello, world,jym!";
        File file = new File("./template/hello.txt");
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(data.getBytes());
        fos.close();

        FileInputStream fis = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        fis.read(buffer);
        String result = new String(buffer).trim();
        fis.close();

        if (data.equals(result)) {
            System.out.println("Pass");
        } else {
            System.out.println("Fail");
        }
    }
}

5.2 代码解析

  该代码演示了如何使用Java的FileOutputStream类来写文件以及使用FileInputStream类来读文件。首先创建了一个字符串数据,然后使用FileOutputStream将其写入到文件中。写入完成后,使用FileInputStream读取文件中的内容,并将读取结果与原始数据进行比较,以确认写入和读取都成功。最后,根据比较结果输出相应的信息(Pass 或 Fail)。

5.3 测试结果

如上测试用例测试结果如下:

在这里插入图片描述

6. 源码分析

  FileOutputStream 是一个 Java IO 中的输出流类,用于将数据写入到文件中。下面是它的源码分析:

6.1 构造函数

public FileOutputStream(String name) throws FileNotFoundException {
    this(name != null ? new File(name) : null, false);
}

public FileOutputStream(String name, boolean append) throws FileNotFoundException {
    this(name != null ? new File(name) : null, append);
}

public FileOutputStream(File file) throws FileNotFoundException {
    this(file, false);
}

public FileOutputStream(File file, boolean append) throws FileNotFoundException {
    String name = (file != null ? file.getPath() : null);
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkWrite(name);
    }
    if (name == null) {
        throw new NullPointerException();
    }
    if (file.isInvalid()) {
        throw new FileNotFoundException("Invalid file path");
    }
    this.fd = new FileDescriptor();
    this.append = append;
    open(name, append);
}

  该类提供了多个构造函数,用户可以根据需要选择。其中,最重要的是最后一个构造函数,它接受一个 File 对象和一个 boolean 值,用于指定是否以追加模式打开文件。在构造函数中,会根据传入的文件路径进行权限检查,然后打开文件,并将文件描述符保存在一个 FileDescriptor 对象中。

6.2 write() 方法

public void write(int b) throws IOException {
    write(new byte[] {(byte) b}, 0, 1);
}

public void write(byte b[]) throws IOException {
    write(b, 0, b.length);
}

public void write(byte b[], int off, int len) throws IOException {
    if (b == null) {
        throw new NullPointerException();
    } else if (off < 0 || len < 0 || off > b.length - len) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return;
    }
    Object traceContext = IoTrace.fileWriteBegin(path);
    int written = 0;
    try {
        ensureOpen();
        while (written < len) {
            int bytesToWrite = Math.min(len - written, MAX_BUFFER_SIZE);
            fd.sync(); // not required for O_APPEND
            int bytesWritten = writeBytes(b, off + written, bytesToWrite);
            written += bytesWritten;
            if (bytesWritten != bytesToWrite) {
                // If we didn't write what we wanted (and we're not closed), we should
                // throw an IOException.  But we should not throw it if we're closed.
                // This is consistent with the behavior of SocketOutputStream.
                if (written < len) {
                    throw new IOException("File system full");
                }
                break;
            }
        }
        if (shouldCloseFD) {
            // we will no longer be writing to this FileOutputStream, so we should
            // release our hold on the underlying fd.  This is not strictly necessary,
            // but it's good citizenship.  :-)
            close();
        }
    } catch (IOException ioe) {
        IoTrace.fileWriteEnd(traceContext, written);
        throw ioe;
    }
    IoTrace.fileWriteEnd(traceContext, written);
}

  在 write() 方法中,会先进行参数检查,然后调用 ensureOpen()方法确保文件已经打开,接着使用一个循环来写入数据。其中,MAX_BUFFER_SIZE 的值为 8192,即一次最多写入 8KB 的数据。每轮循环会先调用 fd.sync() 方法将缓冲区的数据刷新到磁盘,再调用 writeBytes() 方法将数据写入文件中。在写入数据时,如果写入的字节数小于要写入的字节数,说明文件系统已经满了,此时会抛出一个 IOException 异常。

6.3 其他方法

  FileOutputStream 还提供了一些其他的方法,比如 getFD() 方法可以获取文件描述符,close() 方法可以关闭输出流,flush()方法可以将缓冲区的数据写入磁盘等。这些方法的实现比较简单,就不一一列举了。

6.4 源码截图

  如下是FileOutputStream类在io包中的目录位置及部分源码展示:

在这里插入图片描述

  总的来说,FileOutputStream 的源码比较简单,主要是在写入数据时需要进行一些缓冲区的操作和异常的处理。如果你需要写入文件,那么使用 FileOutputStream 是一个不错的选择。

全文小结

  本文介绍了Java IO包中的一些基本知识和FileOutputStream类的使用方法。在具体的介绍中,我们详细讲解了如何使用FileOutputStream来写入文件,并给出了相应的示例代码。最后,我们也介绍了一些FileOutputStream类的常用方法。通过本文的学习,我们可以更加轻松地操作文件流。

总结

  Java IO包中的FileOutputStream类为开发人员提供了一种非常便捷的写入文件的方式。通过本文对FileOutputStream类的介绍,我们可以更加灵活地使用Java编程语言进行文件的操作。因此,在日常的Java开发中,我们应该熟练掌握FileOutputStream类的使用方法。

  …
  好啦,这期的内容就基本接近尾声啦,若你想学习更多,可以参考这篇专栏总结《「滚雪球学Java」教程导航帖》,本专栏致力打造最硬核 Java 零基础系列学习内容,🚀打造全网精品硬核专栏,带你直线超车;欢迎大家订阅持续学习。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你


  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


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

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

相关文章

电力物联网系统设计

电力物联网系统设计 简介 在新能源行业从业多年&#xff0c;参与和负责过大大小小的的项目&#xff0c;发电侧、电网侧、用户侧系统都有过实际的项目经验&#xff0c;这些项目或多或少都有物联网采集方面的需求&#xff0c;本篇文章将会对电力行业物联网经验做一个总结分享。 …

Python 中常用的 GUI(图形用户界面)库介绍

本文将为您详细讲解 Python 中常用的 GUI&#xff08;图形用户界面&#xff09;库&#xff0c;以及它们的特点、区别和优势。Python 提供了多种 GUI 库&#xff0c;每种库都有其特定的用途和优势。这些库包括 Tkinter、PyQt、wxPython 和 Kivy。 1. Tkinter 特点 - 内…

内联函数|auto关键字|范围for的语法|指针空值

文章目录 一、内联函数1.1概念1.2特性 二、auto关键字2.2类型别名思考2.3auto简介2.4auto使用细则2.4 auto不能推导的场景 三、基于范围的for循环(C11)3.1 范围for的语法 四、指针空值nullptr(C11)4.1 C98中的指针空值 所属专栏:C初阶 一、内联函数 1.1概念 以inline修饰的函…

❤ Vue3项目使用yarn 搭建 Vue3+Pinia+Vant3/ElementPlus+typerscript 系统篇(一)

❤ Vue3 完整项目搭建 Vue3PiniaVant3/ElementPlustyperscript系统篇&#xff08;一&#xff09; 1、项目环境和简介 环境 使用nvm 版本 20.10.0 node 版本 20.10.0 npm版本 10.2.3 项目简介&#xff1a; Vue3全家桶viteTSPiniaVant3/ElementPlus-搭建Vue3.x项目 项目开源地…

【JAVA】优化if else的几种方式

在代码编写初期&#xff0c;我们写出来的代码&#xff0c;脉络清晰&#xff0c;结构简单。可随着bug或者新需求的出现&#xff0c;状态变得越来越多&#xff0c;只能不停地加else来区分&#xff0c;久而久之&#xff0c;判断的次数越来越多&#xff0c;嵌套的层数也越来越深&am…

Day 8.TCP包头和HTTP

TCP包头 1.序号&#xff1a;发送端发送数据包的编号 2.确认号&#xff1a;已经确认接收到的数据的编号&#xff08;只有当ACK为1时、确认号才有用&#xff09;&#xff1b; TCP为什么安全可靠 1.在通信前建立三次握手 SYP SYPACK ACK 2.在通信过程中通过序列号和确认号和…

python密码判断 2023年12月青少年编程电子学会python编程等级考试二级真题解析

目录 python密码判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python密码判断 2023年12月 python编程等级考试级编程题 一、题目要求 …

云函数-激活码列表-并发同时读取操作数据解决方案

业务场景 第三方平台创建并提供了激活码列表&#xff0c;每个激活码只能使用一次。并将数据导入数据库中&#xff0c;用户在某个业务场景下获取激活码&#xff0c;N个用户同时请求获取计划码时&#xff0c;会返回同一激活码。 //获取数据 await db_activeCode.where({isUse: t…

手写简易操作系统(一)--环境配置

本专栏是我新开设的一个学术专栏&#xff0c;旨在全面介绍手写操作系统的相关内容。其中包括实模式向保护模式的过渡、锁机制、信号量操作、内存分配、硬盘驱动、文件系统、简单shell和管道等操作系统核心知识。该专栏旨在为有意开发自己操作系统的研究人员提供指导与帮助。作为…

如何在Windows环境下编译OpenOCD

1. 安装Cygwin Windows环境下编译OpenOCD可以是在MinGW-w64/MSYS或Cygwin下&#xff0c;这里选择Cygwin&#xff0c;下载安装Cygwin。 2. 进入OpenOCD源代码目录 打开Cygwin&#xff0c;进入OpenOCD源代码目录&#xff0c;例如代码放在D:\Temp\OpenOCD\openocd-code下&#…

OpenHarmony教程指南-自定义通知推送

介绍 本示例主要展示了通知过滤回调管理的功能&#xff0c;使用ohos.notificationManager 接口&#xff0c;进行通知监听回调&#xff0c;决定应用通知是否发送。 效果预览 使用说明 1.在使用本应用时&#xff0c;需安装自定义通知角标应用&#xff1b; 2.在主界面&#xff…

【Web前端】Vue核心基础

文章目录 1. Vue简介2. Vue官网使用指南3. 初识Vue3.1 搭建Vue开发环境3.2 HelloWorld案例3.3 el与data的两种写法3.4 MVVM模型3.5 模板语法 4. 数据绑定4.1 v-bind单向数据绑定4.2 v-model双向数据绑定 5. 事件处理5.1 v-on绑定事件5.2 事件修饰符5.3 键盘事件 6. 计算属性6.1…

吴恩达机器学习-可选实验室:特征工程和多项式回归(Feature Engineering and Polynomial Regression)

文章目录 目标工具特征工程和多项式回归概述多项式特征选择功能备用视图扩展功能复杂的功能 恭喜! 目标 在本实验中&#xff0c;你将:探索特征工程和多项式回归&#xff0c;它们允许您使用线性回归的机制来拟合非常复杂&#xff0c;甚至非常非线性的函数。 工具 您将利用在以…

rabbitmq4

独占队列&#xff1a;我们的队列只能被当前通道所绑定&#xff0c;不能被其他的连接所绑定&#xff0c;如果有其他的通道或连接再使用此队列的话&#xff0c;会直接报错&#xff0c;一般设置为false&#xff1a; autoDelete&#xff1a;消费者在消费完队列&#xff0c;并且彻底…

[C语言]——分支和循环(4)

目录 一.随机数生成 1.rand 2.srand 3.time 4.设置随机数的范围 猜数字游戏实现 写⼀个猜数字游戏 游戏要求&#xff1a; &#xff08;1&#xff09;电脑自动生成1~100的随机数 &#xff08;2&#xff09;玩家猜数字&#xff0c;猜数字的过程中&#xff0c;根据猜测数据的⼤…

音视频学习笔记——c++多线程(一)

✊✊✊&#x1f308;大家好&#xff01;本篇文章主要整理了部分多线程相关的内容重点&#x1f607;。首先讲解了多进程和多线程并发的区别以及各自优缺点&#xff0c;之后讲解了Thead线程库的基本使用。 本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统…

Linux grep

文章目录 1. 基本用法2.字符转义3.二进制文件查找4.打印目标字段的附近行4. 多条件过滤5. 目录中过滤——用于在文件夹中筛选/排除指定后缀文件6.反向过滤——用于筛选7.只输出匹配内容——用于统计8. 筛选出包含字段的文件9.正则匹配10.管道和grep11.grep和wc/uniq/sort的合用…

在Vue中处理接口返回的二进制图片数据

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

解决方案TypeError: string indices must be integers

文章目录 一、现象&#xff1a;二、解决方案 一、现象&#xff1a; PyTorch深度学习框架&#xff0c;运行bert-mini&#xff0c;本地环境是torch1.4-gpu&#xff0c;发现报错显示&#xff1a;TypeError: string indices must be integers 后面报字符问题&#xff0c;百度过找…

goby的安装和使用

简介 Goby是一款基于网络空间测绘技术的新一代网络安全工具&#xff0c;它通过给目标网络建立完整的资产知识库&#xff0c;进行网络安全事件应急与漏洞应急。 Goby可提供最全面的资产识别&#xff0c;目前预置了超过10万种规则识别引擎&#xff0c;能够针对硬件设备和软件业…