Java 输入输出相关概念介绍与总结(File、IO 流)(七)

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

上一篇Java 输入输出相关概念介绍与总结(File、IO 流)(六)文章介绍的是OutputStream 抽象类在日常开发中最常使用的几个方法,本篇文章将介绍在开发中常用的几个实现类的具体使用。

ByteArrayOutputStream

之前我们有介绍过,这个类是输出流的一个实现类,它本身的含义就是这个类的中文翻译:字节·数组·输出·流。

它的实际作用就是将数据写入到这个输出流中,然后数据会被缓存到一个byte 数组中。这个byte 数组本身是作为一个“缓冲区”,会随着写入的数据的不断增加而自动增长,不用用户关心。

这个类有两个构造函数:

public ByteArrayOutputStream()
public ByteArrayOutputStream(int size)
复制代码

在创建字节数组输出流的实例的时候,其中用来缓存的byte 数组默认的大小为32(第一个构造函数),如果要修改数组大小,可以使用第二个构造函数,传入参数,决定缓存数组的大小。

在创建完成字节数组输出流之后,可以调用write 方法将数据写入,write 方法一个有三个不同类型,可以参考上一篇文章。

这里直接举个例子,以便直观体会ByteArrayOutputStream 的使用。

public static void main(String[] args) throws IOException {
    // 数据来源
    FileInputStream fileInputStream = null;
    // 字节数组输出流
    ByteArrayOutputStream byteArrayOutputStream;
    try {
        fileInputStream = new FileInputStream("abc/def/ghi.txt");
        byteArrayOutputStream = new ByteArrayOutputStream();
        int tempResult;
        while ((tempResult = fileInputStream.read()) != -1) {
            // 从输入流中读取到的数据依次写入到输出流中
            byteArrayOutputStream.write(tempResult);
        }
        byte[] result = byteArrayOutputStream.toByteArray();
        // 输入utf-8 字符集,将缓冲区的内容转换为字符串
        System.out.println(new String(result, "utf-8"));
        // 或者直接调用toString() 方法
        System.out.println(byteArrayOutputStream.toString("utf-8");
        fileInputStream.close();
    } catch (Exception e) {
    } finally {
        fileInputStream.close();
    }
}
复制代码

总结来说使用ByteArrayOutputStream 就是在内存中创建了一个byte 数组,将所有发送到输出流的数据都保存到这个字节数组中,也可以认为这就是一个缓冲区。数据写入缓冲区之后,可以调用toByteArray() 或者toString() 进行输出。

在使用toString() 方法的时候,我们可以指定输出字符串的字符集。使用指定的字符集(参数:charsetName)去解码字节,然后将缓冲区的内容转换为字符串。 新String的长度是转换完成的字符集的长度,所以有可能不等于字节数组的长度。

FileOutputStream

FileOutputStream 是文件字节输出流,这个类的作用是把内存中的数据写入到硬盘的文件中。

对于FileOutputStream 类,它有五个构造函数。

public FileOutputStream(String name)
public FileOutputStream(File file)
public FileOutputStream(File file,boolean append)
public FileOutputStream(String name,boolean append)
public FileOutputStream(FileDescriptor fdObj)
复制代码

这五个构造函数的含义一看便知,其中只有一个参数需要我们注意一下,那就是那个append参数。

这个参数默认是false,如果为false,那么新写入的内容会覆盖原有的文件内容;如果是true,那么新数据会附加到原有的数据后面。

总结

这两个子类是OutputStream 抽象类的两个常用实现类。我们日常开发中使用的最多的也就是这两个。

在之后的文章会大概介绍一下OutputStream 的几个不常用的实现类,如果用不到或者不了解,可以选择跳过下一篇文章。

猜你喜欢

转载自juejin.im/post/7083662044389441549