Java的IO流

输入流和输出流

在 Java 中,输入流和输出流是 IO 操作中的常见概念,它们分别用于读取数据和写入数据。在输入和输出时,数据以字节或字符的方式流动。这种数据流经常需要使用内存来存储和传输,这会涉及到内存缓冲区的概念。

内存缓冲区是 Java 中标准库使用的一种通用机制,用于优化 IO 操作。内存缓冲区通常是一个内部数组,用于暂存有关数据的字节或字符。在输入时,Java 会将数据读入内存缓冲区中,并按需提供给应用程序;在输出时,Java 会将数据存储在内存缓冲区中,并在缓冲区满或需要刷新时写入磁盘或网络。

这里有一个比喻可以帮助你更好地理解输入流和输出流的区别。想象你正在看一本书,书页是由纸张组成的。在输入方面,你正在阅读一本书,你正在从书中读取数据(或内容)。在输出方面,你正在编写一篇文章或制作一个总结,你正在将数据写入笔记本中。

在 Java 中,输入流和输出流的主要区别在于使用的方法。使用输入流时,数据将在内存缓冲区中读取,并使用 read() 方法逐步处理数据。使用输出流时,数据将写入内存缓冲区,并使用 write() 方法一次性写入磁盘或网络。

为了更好地记忆输入流和输出流,在输入时,我们常常需要使用 read() 方法,读取数据到应用程序中;在输出时,我们通常需要使用 write() 方法,将数据写入到文件、网络或其他应用程序中。

划分字节流和字符流

Java中的 IO 流可以划分为以下两类:

  • 字节流
  • 字符流

字节流适用于读写二进制数据,而字符流适用于读写文本数据。

Java 还提供了输入输出流的抽象基类:InputStream 和 OutputStream 以及 Reader 和 Writer。

下面我们将会讲解如何在 Java 中使用 IO 流来读写数据。

字节流

FileInputStream

FileInputStream 用于从文件中读取数据。以下是一个使用 FileInputStream 读取文件的例子:

try (FileInputStream inputStream = new FileInputStream("data.txt")) {
    int data = inputStream.read();
    while (data != -1) {
        System.out.print((char) data);
        data = inputStream.read();
    }
} catch (IOException e) {
    e.printStackTrace();
}

在上面的代码中,我们使用 try-with-resources 语句来自动关闭输入流。使用 FileInputStream 的 read 方法来读取数据。我们可以通过读取返回值来知道是否已达到了文件的末尾。

BufferedInputStream

BufferedInputStream 用于读取大量数据时提高读取速度。默认情况下,每次调用 read 方法只会读取一个字节,使用 BufferedInputStream 可以读取大量数据并存储在内存缓冲区中,避免了频繁的读取磁盘。

以下是一个使用 BufferedInputStream 读取文件的例子:

try (BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("data.txt"))) {
    int data = inputStream.read();
    while (data != -1) {
        System.out.print((char) data);
        data = inputStream.read();
    }
} catch (IOException e) {
    e.printStackTrace();
}

在上面的代码中,我们使用 BufferedInputStream 来读取文件,并调用其 read 方法来读取数据。

FileOutputStream

FileOutputStream 用于将数据写入文件。以下是一个使用 FileOutputStream 写入数据的例子:

try (FileOutputStream outputStream = new FileOutputStream("data.txt")) {
    outputStream.write('H');
    outputStream.write('e');
    outputStream.write('l');
    outputStream.write('l');
    outputStream.write('o');
} catch (IOException e) {
    e.printStackTrace();
}

在上面的代码中,我们使用 FileOutputStream 来写入数据,并调用其 write 方法来写入数据。

BufferedOutputStream

BufferedOutputStream 用于写入大量数据时提高写入速度。以下是一个使用 BufferedOutputStream 写入数据的例子:

try (BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("data.txt"))) {
    outputStream.write('H');
    outputStream.write('e');
    outputStream.write('l');
    outputStream.write('l');
    outputStream.write('o');
} catch (IOException e) {
    e.printStackTrace();
}

在上面的代码中,我们使用 BufferedOutputStream 来写入数据,并调用其 write 方法来写入数据。

字符流

FileReader

FileReader 用于从文件中读取字符数据。以下是一个使用 FileReader 读取文件的例子:

try (FileReader reader = new FileReader("data.txt")) {
    int data = reader.read();
    while (data != -1) {
        System.out.print((char) data);
        data = reader.read();
    }
} catch (IOException e) {
    e.printStackTrace();
}

在上面的代码中,我们使用 try-with-resources 语句来自动关闭读取流。使用 FileReader 的 read 方法来读取数据。我们可以通过读取返回值来知道是否已达到了文件的末尾。

BufferedReader

BufferedReader 用于读取大量数据时提高读取速度。以下是一个使用 BufferedReader 读取文件的例子:

try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
    String line = reader.readLine();
    while (line != null) {
        System.out.print(line);
        line = reader.readLine();
    }
} catch (IOException e) {
    e.printStackTrace();
}

在上面的代码中,我们使用 BufferedReader 来读取文件,并调用其 readLine 方法来读取数据。

FileWriter

FileWriter 用于将字符数据写入文件。以下是一个使用 FileWriter 写入数据的例子:

try (FileWriter writer = new FileWriter("data.txt")) {
    writer.write("Hello");
} catch (IOException e) {
    e.printStackTrace();
}

在上面的代码中,我们使用 FileWriter 来写入数据,并调用其 write 方法来写入数据。

BufferedWriter

BufferedWriter 用于写入大量数据时提高写入速度。以下是一个使用 BufferedWriter 写入数据的例子:

try (BufferedWriter writer = new BufferedWriter(new FileWriter("data.txt"))) {
    writer.write("Hello");
} catch (IOException e) {
    e.printStackTrace();
}

在上面的代码中,我们使用 BufferedWriter 来写入数据,并调用其 write 方法来写入数据。

总结

Java中的 IO 流可以分为字节流和字符流,分别适用于读写二进制数据和文本数据。Java 还提供了输入输出流的抽象基类:InputStream 和 OutputStream 以及 Reader 和 Writer。同时,Java 8 中还提供了 BufferedInputStream 和 BufferedOutputStream 以及 BufferedReader 和 BufferedWriter,用于提高读写速度。在使用 IO 流时,请注意关闭流避免资源泄漏。

关注微信公众号:“小虎哥的技术博客”。我们会定期发布关于Java技术的详尽文章,让您能够深入了解该领域的各种技巧和方法,让我们一起成为更优秀的程序员👩‍💻👨‍💻!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小虎哥的技术博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值