在 Java 中,输入流和输出流是 IO 操作中的常见概念,它们分别用于读取数据和写入数据。在输入和输出时,数据以字节或字符的方式流动。这种数据流经常需要使用内存来存储和传输,这会涉及到内存缓冲区的概念。
内存缓冲区是 Java 中标准库使用的一种通用机制,用于优化 IO 操作。内存缓冲区通常是一个内部数组,用于暂存有关数据的字节或字符。在输入时,Java 会将数据读入内存缓冲区中,并按需提供给应用程序;在输出时,Java 会将数据存储在内存缓冲区中,并在缓冲区满或需要刷新时写入磁盘或网络。
这里有一个比喻可以帮助你更好地理解输入流和输出流的区别。想象你正在看一本书,书页是由纸张组成的。在输入方面,你正在阅读一本书,你正在从书中读取数据(或内容)。在输出方面,你正在编写一篇文章或制作一个总结,你正在将数据写入笔记本中。
在 Java 中,输入流和输出流的主要区别在于使用的方法。使用输入流时,数据将在内存缓冲区中读取,并使用 read() 方法逐步处理数据。使用输出流时,数据将写入内存缓冲区,并使用 write() 方法一次性写入磁盘或网络。
为了更好地记忆输入流和输出流,在输入时,我们常常需要使用 read() 方法,读取数据到应用程序中;在输出时,我们通常需要使用 write() 方法,将数据写入到文件、网络或其他应用程序中。
Java中的 IO 流可以划分为以下两类:
字节流适用于读写二进制数据,而字符流适用于读写文本数据。
Java 还提供了输入输出流的抽象基类:InputStream 和 OutputStream 以及 Reader 和 Writer。
下面我们将会讲解如何在 Java 中使用 IO 流来读写数据。
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 用于读取大量数据时提高读取速度。默认情况下,每次调用 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 写入数据的例子:
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 写入数据的例子:
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 读取文件的例子:
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 读取文件的例子:
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 写入数据的例子:
try (FileWriter writer = new FileWriter("data.txt")) {
writer.write("Hello");
} catch (IOException e) {
e.printStackTrace();
}
在上面的代码中,我们使用 FileWriter 来写入数据,并调用其 write 方法来写入数据。
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技术的详尽文章,让您能够深入了解该领域的各种技巧和方法,让我们一起成为更优秀的程序员!