如何使用OutputStream类实现文件的读写操作?

2023-11-21 11:38:49 浏览数 (1)


theme: healer-readable

highlight: a11y-dark


哈喽,各位小伙伴们,你们好呀,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在Java中,输入输出流是非常重要的概念。输入流用于读取数据,而输出流则用于将数据写入到输出目的地。在本文中,我们将着重介绍Java中的OutputStream类,这是一个抽象类,用于向各种输出目的地写入数据。

摘要

本文将介绍使用Java中的OutputStream类进行文件、网络、控制台的输出操作,并会分析该类的优缺点。

OutputStream类

简介

在Java中,OutputStream类是一个抽象类,它提供了向各种输出目的地写入数据的一般方法。OutputStream类是所有输出流类的祖先类,包括FileOutputStream、ByteArrayOutputStream、PipedOutputStream等。

OutputStream类的主要方法是write()。它的基本形式接受一个字节,但也有其他几种变体形式,如写入整个字节数组、部分字节数组等。

源代码解析

Java中的OutputStream类是一个抽象类,它是字节输出流的基类。OutputStream类提供了许多方法,用于将字节写入输出流中。

以下是OutputStream类的一些常见方法:

  • public void write(int b):将指定的字节写入输出流。
  • public void write(byte[] b):将b数组中的所有字节写入输出流。
  • public void write(byte[] b, int off, int len):将b数组中从off位置开始的len个字节写入输出流。
  • public void flush():刷新输出流,强制将所有缓冲的输出字节写入底层输出流。
  • public void close():关闭输出流并释放与该流相关联的所有系统资源。

OutputStream类的实现通常是通过子类来完成的,例如FileOutputStream、ByteArrayOutputStream、PipedOutputStream等。

以下是OutputStream类的部分源代码:

代码语言:java复制
public abstract class OutputStream implements Closeable, Flushable {
    // …

    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   len > b.length) {
            throw new IndexOutOfBoundsException();
        } else if (len == 0) {
            return;
        }

        for (int i = 0; i < len; i  ) {
            write(b[off   i]);
        }
    }

    public abstract void write(int b) throws IOException;

    public void flush() throws IOException {
    }

    public void close() throws IOException {
    }

    // …
}

从以上代码可以看出,OutputStream类定义了抽象方法write(),其余方法都是具体实现的。在write(byte b[])和write(byte b[], int off, int len)方法中,也调用了write(int b)方法来实现写入操作。

OutputStream类还实现了Closeable和Flushable接口,使得它可以通过调用close()和flush()方法来关闭和刷新输出流。

  如下是部分源码截图:

在这里插入图片描述在这里插入图片描述

应用场景案例

OutputStream类可以用于多种输出目的地,如文件、网络、控制台等。下面是一些常见的应用场景案例:

1. 将数据写入文件

使用FileOutputStream可以将数据写入文件。以下是一个示例:

代码语言:java复制
FileOutputStream fos = new FileOutputStream("output.txt");
for (int i = 0; i < 10; i  ) {
    fos.write(i);
}
fos.close();

2. 将数据写入网络

使用SocketOutputStream可以将数据写入网络。以下是一个示例:

代码语言:java复制
Socket socket = new Socket("127.0.0.1", 8080);
OutputStream os = socket.getOutputStream();
os.write("Hello, world".getBytes());
os.close();

3. 将数据打印到控制台

使用System.out可以将数据打印到控制台。以下是一个示例:

代码语言:java复制
System.out.write("Hello, world".getBytes());

优缺点分析

优点

  • OutputStream类具有通用性,可以向多种输出目的地写入数据。
  • OutputStream类提供了多种写入数据的方法,可以根据需求选择适当的方法。
  • OutputStream类是抽象类,可以被继承并进行扩展。

缺点

  • OutputStream类的write()方法不能保证一次写入所以数据都成功,需要在外部进行判断并处理。

类代码方法介绍

以下是OutputStream类的主要方法:

方法名称

说明

write(int b)

将指定的字节写入输出流

write(byte[] b)

将指定的字节数组写入输出流

write(byte[] b, int off, int len)

将指定的字节数组中的一部分写入输出流

flush()

刷新输出流

close()

关闭输出流

测试用例

测试代码演示

以下是一个OutputStream的测试用例:

代码语言:java复制
package com.example.javase.se.classes;

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

/**
 * @Author ms
 * @Date 2023-11-05 18:26
 */
public class OutputStreamTest {

    public static void main(String[] args) {
        // 写入文件
        try {
            FileOutputStream fos = new FileOutputStream("test.txt");
            byte[] data = "Hello, world!".getBytes();
            fos.write(data);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            System.out.println("写入文件时发生错误:"   e);
        }

        // 写入控制台
        OutputStream os = System.out;
        byte[] data = "Hello, world!".getBytes();
        try {
            os.write(data);
            os.flush();
            os.close();
        } catch (IOException e) {
            System.out.println("写入控制台时发生错误:"   e);
        }
    }
}

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

在这里插入图片描述在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

这是一个使用Java的输出流(OutputStream)进行写操作的示例代码。代码主要包括两部分:

第一部分在文件系统中创建一个名为“test.txt”的文本文件,并在该文件中写入“Hello, world!”字符串。

第二部分将同样的字符串输出到控制台。输出流通过System.out获取,然后将字符串转换为字节数组,使用write方法将字节数组写入控制台。最后通过flush和close方法刷新并关闭输出流。

需要注意的是,这里的文件和控制台的输出流类型都是OutputStream,这个抽象类提供了写入字节数据的通用方法,实际使用时需要根据具体需求选择不同的OutputStream子类进行实例化。

全文小结

在本文中,我们介绍了Java中的OutputStream类,该类提供了向各种输出目的地写入数据的一般方法。我们学习了如何使用OutputStream将数据写入文件、网络、控制台等目的地,并分析了该类的优缺点。最后,我们提供了一个OutputStream的测试用例。

总结

本文介绍了Java中的OutputStream类,它是一个抽象类,提供了向各种输出目的地写入数据的一般方法。我们学习了如何使用OutputStream将数据写入文件、网络、控制台等目的地,并分析了该类的优缺点。此外,本文还提供了一个OutputStream的测试用例。总的来说,OutputStream是Java中重要的输出流类之一,提供了许多方法,可以根据需求选择适当的方法来实现数据的写入操作。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞