IO流详解——FileOutputStream字节输出流

360 阅读4分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。

前言

大家好,我是程序猿小白 gw_Gw,很高兴能和大家一起学习进步。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要介绍FileOutputStream字节输出流的基本概念和使用。

欢迎点击传送门了解更多IO流。

IO流详解——FileInputStream字节输入流

1. FileOutputStream使用字节流写入文件

1.1 什么是FileOutputStream

FileOutputStream是java.io包下的OutputStream的子类。用于写入文件。我们知道,一切皆字节。所以使用FileOutputStream可以写入任意类型的文件。但是对于中文字符,可能出现乱码的情况,所以我们写入中文字符时不使用该类,而是使用字符流来写入文件。大多时候我们使用该类写入诸如图像数据之类的原始字节的流。

1.2 FileOutputStream的构造方法

FileOutputStream(File file) 
          创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 
FileOutputStream(File file, boolean append) 
          创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 
FileOutputStream(String name) 
          创建一个向具有指定名称的文件中写入数据的输出文件流。 
FileOutputStream(String name, boolean append) 
          创建一个向具有指定 name 的文件中写入数据的输出文件流。 

构造方法解析:

File file:传入一个File对象。

String name:传入一个文件路径

boolean append:true表示追加写,false表示覆盖写。

实例展示:

try {
    //传入File对象,覆盖写
    FileOutputStream fileOutputStream = new FileOutputStream(new File("F:\1.txt"));
    //传入File对象,追加写
    FileOutputStream fileOutputStream1 = new FileOutputStream(new File("F:\1.txt"),true);
    //传入文件路径,覆盖写
    FileOutputStream fileOutputStream2 = new FileOutputStream("F:\1.txt");
    //传入文件路径,追加写
    FileOutputStream fileOutputStream3 = new FileOutputStream("F:\1.txt",true);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

1.3 FileOutputStream的常用方法

FileOutputStream继承了OutputStream(输出字节流的所有类的超类).

输出字节流的共性方法它都有并重写了write和close方法:

void close() 
        关闭此输出流并释放与此流有关的所有系统资源。 
void flush() 
        刷新此输出流并强制写出所有缓冲的输出字节。 
void write(byte[] b) 
        将整个btye写入此文件输出流
void write(byte[] b, int off, int len) 
        将指定 byte 数组中从 off 开始的 len 个字节写入此文件输出流。 
void write(int b) 
        将指定字节写入此文件输出流。 

这里我们先介绍一个flush方法和close方法。

在缓冲流中:

flush用来将缓冲区的数据强制写入到文件中,而close方法会调用flush()方法达到同样的效果。

而对于字节流来说flush()并没有实际意义,close()也只是起到释放资源的作用。

这是因为:

OutputStream中的flush和close方法是空的,并没有具体的执行语句。而FileOutputStream只是重写了close方法,而没有重写flush方法,并且没有调用flush方法,就算调用了也没什么用(flush是空的)。

来看源码:

public void flush() throws IOException {
}
public void close() throws IOException {
        synchronized (closeLock) {
            if (closed) {
                return;
            }
            closed = true;
        }
​
        if (channel != null) {
            channel.close();
        }
​
        fd.closeAll(new Closeable() {
            public void close() throws IOException {
               close0();
           }
        });
    }

实例展示:

FileOutputStream fileOutputStream = new FileOutputStream(new File("Study01\src\main\java\FileDemo\1.txt"));
fileOutputStream.write(99);

image-20211216195927550

可以看到这里我们没有使用flush()和close()方法仍然能把数据写入到文件。

而剩下两个write方法也是一样的。但是剩下两个能够一次往文件中写入多个字节。

byte[] b = new byte[]{97,98};
fileOutputStream.write(b);
fileOutputStream.write(b,0,1);

image-20211216204606209

这都是写入字节,那怎么向文件中写入字符串呢?可以使用String类的getBytes方法们将字符串转化为字节数组。

public byte[] getBytes()
        使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
fileOutputStream.write("你好".getBytes());

image-20211216205018483

最后一步一定不要忘记,那就是关闭资源。

fileOutputStream.close();

虽然有些流中的close方法是空的(比如BufferedOutputStream),也就是说执不执行都不影响,但是我们还是应该都养成随手关闭资源的好习惯

1.4 FileOutputStream小结

使用FileOutputStream的步骤:

  1. 创建流对象

    • 参数是File或者是文件路径
  2. 调用write方法

  3. 关闭流资源

FileOutputStream特点:

  1. 可以写入任意类型的文件,但是只推荐用于图像数据之类的原始字节的流。
  2. 在write操作后不需要调用flush方法也能把数据写入到文件。

小结

以上就是我对于字节输出流的一些理解,希望对读者有所帮助,如有不正之处,欢迎掘友们留言指正。