likes
comments
collection
share

换个角度思考Java IO中各种流的分类和实际应用

作者站长头像
站长
· 阅读数 15

Java IO(输入输出)是任何编程语言中最常用的部分之一,它提供了在程序中读取和写入数据的方法。Java IO库包含多个类和接口,这些类和接口被组织成不同的包,每个包都有一个特定的目的或功能。Java IO库中最重要的概念之一是流(Stream)。流表示数据在程序中的传递方式。在这篇文章中,我们将深入了解Java IO中各种流的分类和实际应用。

换个角度思考Java IO中各种流的分类和实际应用

Java IO库提供了众多可用于读写数据流的类,这些类主要分为四类:字节流、字符流、节点流和处理流。下面是一些常用的Java IO流类:

1.字节流

  • InputStream:抽象类,所有字节输入流的父类。

  • FileInputStream:读取文件中的数据。

  • ObjectInputStream:读取Java对象的序列化形式。

  • BufferedInputStream:缓存输入流,提高读取速度。

  • DataInputStream:允许Java程序以与机器无关方式从底层输入流中读取基本Java数据类型。

  • OutputStream:抽象类,所有字节输出流的父类。

  • FileOutputStream:向文件中写入数据。

  • ObjectOutputStream:将Java对象写入输出流并序列化。

  • BufferedOutputStream:缓存输出流,提高写入速度。

  • DataOutputStream:允许Java程序以与机器无关方式从底层输出流中写入基本Java数据类型。

2. 字符流

  • Reader:抽象类,所有字符输入流的父类。

  • FileReader:读取文件中的字符。

  • BufferedReader:缓存输入流,提高读取速度。

  • InputStreamReader:将字节流转换为字符流。

  • Writer:抽象类,所有字符输出流的父类。

  • FileWriter:向文件中写入字符。

  • BufferedWriter:缓存输出流,提高写入速度。

  • OutputStreamWriter:将字符流转换为字节流。

3. 节点流

  • FileInputStream:读取文件中的数据。
  • FileOutputStream:向文件中写入数据。
  • RandomAccessFile:允许Java程序直接访问任意位置的文件数据。

4. 处理流

  • BufferedInputStream:缓存输入流,提高读取速度。
  • BufferedOutputStream:缓存输出流,提高写入速度。
  • DataInputStream:允许Java程序以与机器无关方式从底层输入流中读取基本数据类型。
  • DataOutputStream:允许Java程序以与机器无关方式从底层输出流中写入基本数据类型。
  • PrintStream:打印各种数据值表示形式的输出流。
  • PrintWriter:格式化输出流,可以输出各种数据类型和格式的值。

除了上述列出的常用流类,Java IO库中还有许多其他流实现可供选择,并可以通过这些流类构建自定义流。

一、 流的概念

流是一个连续的字节序列,可以从一个地方流动到另一个地方。在Java中,流代表数据的“面向字节”的传输,这意味着数据以字节的形式读取或写入。Java中的流被定义为InputStream和OutputStream,它们是所有流的基本接口。Java还提供了Reader和Writer接口,这些接口处理字符流。

换个角度思考Java IO中各种流的分类和实际应用

二、 流的分类

Java中的流可分为四种类型:字节流、字符流、节点流和处理流。

(1)字节流

字节流以byte为单位读写数据,它可以读取任意类型的文件,包括图像、文档等。字节流主要有InputStream和OutputStream两种类型。InputStream提供了多种方法来读取字节数据,例如read(),read(byte[] b)等,而OutputStream可以将字节写入文件中,例如write(int b),write(byte[] b)等。以下是InputStream和OutputStream的示例代码:

// 从文件中读取字节
InputStream inputStream = new FileInputStream("example.txt");
int b;
while ((b = inputStream.read()) != -1) {
    System.out.write(b);
}
inputStream.close();

// 将字节写入文件中
byte[] bytes = "hello world".getBytes();
OutputStream outputStream = new FileOutputStream("example.txt");
outputStream.write(bytes, 0, bytes.length);
outputStream.close();

(2)字符流

字符流以char为单位读写数据,它可以处理纯文本文件,并且具有更高的效率。Java提供了两种类型的字符流:Reader和Writer。Reader提供了多种方法来读取字符数据,例如read(),read(char[] cbuf),而Writer可以将字符写入文件中,例如write(int c),write(char[] cbuf)等。以下是Reader和Writer的示例代码:

// 从文件中读取字符
Reader reader = new FileReader("example.txt");
int c;
while ((c = reader.read()) != -1) {
    System.out.print((char) c);
}
reader.close();

// 将字符写入文件中
char[] chars = "hello world".toCharArray();
Writer writer = new FileWriter("example.txt");
writer.write(chars, 0, chars.length);
writer.close();

(3)节点流

节点流直接从一个外部源(如文件或网络套接字)读取数据或写入数据,这些流称为节点流。在Java IO库中,FileInputStream、FileOutputStream等都属于节点流。以下是FileInputStream和FileOutputStream的示例代码:

// 从文件中读取字节
FileInputStream inputStream = new FileInputStream("example.txt");
int b;
while ((b = inputStream.read()) != -1) {
    System.out.write(b);
}
inputStream.close();

// 将字节写入文件中
byte[] bytes = "hello world".getBytes();
FileOutputStream outputStream = new FileOutputStream("example.txt");
outputStream.write(bytes, 0, bytes.length);
outputStream.close();

(4)处理流

处理流是一个连接到另一个流的流,处理流本身并不存储数据,但它可以对数据进行加工、转换等操作。Java提供了许多处理流,例如BufferedInputStream、BufferedOutputStream等。BufferedInputStream和BufferedOutputStream 可以用来提高读写速度。以下是BufferedInputStream和BufferedOutputStream的示例代码:

// 从文件中读取字节
InputStream inputStream = new FileInputStream("example.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
int b;
while ((b = bufferedInputStream.read()) != -1) {
    System.out.write(b);
}
bufferedInputStream.close();
inputStream.close();

// 将字节写入文件中
byte[] bytes = "hello world".getBytes();
OutputStream outputStream = new FileOutputStream("example.txt");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
bufferedOutputStream.write(bytes, 0, bytes.length);
bufferedOutputStream.flush();
bufferedOutputStream.close();
outputStream.close();

三、 流的应用

Java IO的流具有广泛的应用,以下是一些实际应用场景:

从文件中读取数据: 使用FileInputStream或FileReader读取文件数据是很常见的操作。以下是一个使用BufferedReader读取文件的示例代码:

BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
reader.close();

将数据写入文件:

使用FileOutputStream或FileWriter将数据写入文件是很常见的操作。以下是一个使用BufferedWriter写入文件的示例代码:

BufferedWriter writer = new BufferedWriter(new FileWriter("example.txt"));
writer.write("hello world");
writer.newLine();
writer.flush();
writer.close();

从网络中读取数据:

Java中也可以通过网络获取数据,使用Socket类可以从URL或HTTP服务器读取数据。以下是一个使用Socket读取数据的示例代码:

Socket socket = new Socket("www.example.com", 80);
InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
reader.close();
inputStream.close();
socket.close();

四、 总结

在这篇文章中,我们深入了解了Java IO中各种流的分类和实际应用。由于面向字节的流和字符流(面向字符的流)具有不同的目的和特点,因此选择正确的流类型对于正确完成任务非常重要。在实际开发中,我们需要根据应用场景选择适当的流类型来处理输入输出。

转载自:https://juejin.cn/post/7227431053249445944
评论
请登录