【IO流系列】FileOutputStream 字节输出流

本文详细介绍了Java中的FileOutputStream类,包括其作用、使用步骤(创建对象、写入数据、关闭流)、构造方法(包括append选项)、换行和续写方法,以及注意事项如数据丢失、异常处理、文件权限和资源释放。
摘要由CSDN通过智能技术生成

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
            //本地文件 File
            FileOutputStream 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\n
        Linux:\n
        Mac: \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;
    
    /*续写
    续写:
    如果想要续写,打开续写开关即可
    
    开关位置:创建对象的第二个参数append
        public 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 流,释放资源,避免资源泄露和程序性能问题。

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷小洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值