原创

Java中IO 流分为几种?


概述

在Java中,流(Stream)是一种用于在程序间传输数据的抽象。流分为输入流和输出流,根据处理单位的不同,又分为字节流和字符流。本教程将深入探讨Java流的不同类型和功能,以及它们的应用场景。

输入流(Input)与输出流(Output)

流根据数据的流向可分为输入流和输出流。输入流用于将外部数据流入程序,输出流则用于将程序中的数据流出。

字节流与字符流

流根据处理单位可分为字节流和字符流。字节流以字节为单位进行输入输出,而字符流以字符为单位进行输入输出。字节流主要操作二进制数据,而字符流则主要用于操作文本数据。

字节流和字符流的主要区别在于,字节流一次处理一个字节(8位),而字符流一次处理一个字符(16位)。

在JDK中,字节流的类名通常以Stream结尾,而字符流的类名通常以ReaderWriter结尾。

节点流与处理流

流还可以根据其在流结构中的角色分为节点流和处理流。

节点流:直接与数据源相连,是直接进行数据读写的流。如FileInputStreamFileOutputStream等。处理流:在节点流的基础上,再套接一层提供额外的功能。处理流不能独立存在,必须连接在节点流上。如BufferedInputStreamBufferedOutputStream等。

常用流的分类

1. 输入流(InputStream)和输出流(OutputStream)

输入流

FileInputStream(字节输入流):从文件中读取数据的输入流。

InputStream input = new FileInputStream("example.txt");

Demo Code:

   try (InputStream input = new FileInputStream("example.txt")) {       // 读取文件数据的代码   } catch (IOException e) {       e.printStackTrace();   }

PipedInputStream(字节输入流):用于从管道读取数据的输入流。

PipedInputStream pipedInput = new PipedInputStream();

Demo Code:

   try (PipedInputStream pipedInput = new PipedInputStream()) {       // 从管道读取数据的代码   } catch (IOException e) {       e.printStackTrace();   }

输出流

FileOutputStream(字节输出流):向文件中写入数据的输出流。

OutputStream output = new FileOutputStream("example.txt");

Demo Code:

   try (OutputStream output = new FileOutputStream("example.txt")) {       // 向文件写入数据的代码   } catch (IOException e) {       e.printStackTrace();   }

PipedOutputStream(字节输出流):用于向管道写入数据的输出流。

PipedOutputStream pipedOutput = new PipedOutputStream();

Demo Code:

   try (PipedOutputStream pipedOutput = new PipedOutputStream()) {       // 向管道写入数据的代码   } catch (IOException e) {       e.printStackTrace();   }

2. 字节流(ByteStream)和字符流(CharStream)

字节流

ByteArrayInputStream:从字节数组读取数据的输入流。

InputStream byteInput = new ByteArrayInputStream(new byte[]{1, 2, 3});

Demo Code:

   try (InputStream byteInput = new ByteArrayInputStream(new byte[]{1, 2, 3})) {       // 从字节数组读取数据的代码   } catch (IOException e) {       e.printStackTrace();   }

ByteArrayOutputStream:向字节数组写入数据的输出流。

OutputStream byteOutput = new ByteArrayOutputStream();

Demo Code:

   try (OutputStream byteOutput = new ByteArrayOutputStream()) {       // 向字节数组写入数据的代码   } catch (IOException e) {       e.printStackTrace();   }

字符流

CharArrayReader:从字符数组读取数据的输入流。

Reader charInput = new CharArrayReader(new char[]{'a', 'b', 'c'});

Demo Code:

   try (Reader charInput = new CharArrayReader(new char[]{'a', 'b', 'c'})) {       // 从字符数组读取数据的代码   } catch (IOException e) {       e.printStackTrace();   }

CharArrayWriter:向字符数组写入数据的输出流。

Writer charOutput = new CharArrayWriter();

Demo Code:

   try (Writer charOutput = new CharArrayWriter()) {       // 向字符数组写入数据的代码   } catch (IOException e) {       e.printStackTrace();   }

3. 缓冲流(Buffered)

缓冲流用于提高读写性能,它在节点流的基础上添加了缓冲区。

字节缓冲流

BufferedInputStream:带缓冲区的字节输入流。

InputStream bufferedByteInput = new BufferedInputStream(new FileInputStream("example.txt"));

Demo Code:

   try (InputStream bufferedByteInput = new BufferedInputStream(new FileInputStream("example.txt"))) {       // 使用带缓冲区的字节输入流的代码   } catch (IOException e) {       e.printStackTrace();   }

BufferedOutputStream:带缓冲区的字节输出流。

OutputStream bufferedByteOutput = new BufferedOutputStream(new FileOutputStream("example.txt"));

Demo Code:

   try (OutputStream bufferedByteOutput = new BufferedOutputStream(new FileOutputStream("example.txt"))) {       // 使用带缓冲区的字节输出流的代码   } catch (IOException e) {       e.printStackTrace();   }

字符缓冲流

BufferedReader:带缓冲区的字符输入流。

Reader bufferedCharInput = new BufferedReader(new FileReader("example.txt
"));

Demo Code:

   try (Reader bufferedCharInput = new BufferedReader(new FileReader("example.txt"))) {       // 使用带缓冲区的字符输入流的代码   } catch (IOException e) {       e.printStackTrace();   }

BufferedWriter:带缓冲区的字符输出流。

Writer bufferedCharOutput = new BufferedWriter(new FileWriter("example.txt"));

Demo Code:

   try (Writer bufferedCharOutput = new BufferedWriter(new FileWriter("example.txt"))) {       // 使用带缓冲区的字符输出流的代码   } catch (IOException e) {       e.printStackTrace();   }

4. 转换流(Reader/Writer)

转换流用于处理字节流和字符流之间的转换。

InputStreamReader:将字节流转换为字符流的转换输入流。

Reader inputStreamReader = new InputStreamReader(new FileInputStream("example.txt"));

Demo Code:

   try (Reader inputStreamReader = new InputStreamReader(new FileInputStream("example.txt"))) {       // 使用将字节流转换为字符流的转换输入流的代码   } catch (IOException e) {       e.printStackTrace();   }

OutputStreamWriter:将字符流转换为字节流的转换输出流。

Writer outputStreamWriter = new OutputStreamWriter(new FileOutputStream("example.txt"));

Demo Code:

   try (Writer outputStreamWriter = new OutputStreamWriter(new FileOutputStream("example.txt"))) {       // 使用将字符流转换为字节流的转换输出流的代码   } catch (IOException e) {       e.printStackTrace();   }

5. 数据流(Data)

数据流用于处理基本数据类型和字符串类型。

DataInputStream:用于读取基本数据类型和字符串的输入流。

DataInputStream dataInput = new DataInputStream(new FileInputStream("example.dat"));

Demo Code:

   try (DataInputStream dataInput = new DataInputStream(new FileInputStream("example.dat"))) {       // 读取基本数据类型和字符串的代码   } catch (IOException e) {       e.printStackTrace();   }

DataOutputStream:用于写入基本数据类型和字符串的输出流。

DataOutputStream dataOutput = new DataOutputStream(new FileOutputStream("example.dat"));

Demo Code:

   try (DataOutputStream dataOutput = new DataOutputStream(new FileOutputStream("example.dat"))) {       // 写入基本数据类型和字符串的代码   } catch (IOException e) {       e.printStackTrace();   }

6. 打印流(Print)

打印流提供了打印各种数据值表示形式的便捷方法。

PrintStream:用于打印各种数据值的输出流。

PrintStream printStream = new PrintStream(new FileOutputStream("example.txt"));

Demo Code:

   try (PrintStream printStream = new PrintStream(new FileOutputStream("example.txt"))) {       // 打印各种数据值的代码   } catch (IOException e) {       e.printStackTrace();   }

PrintWriter:用于打印各种数据值的输出流。

PrintWriter printWriter = new PrintWriter(new FileWriter("example.txt"));

Demo Code:

   try (PrintWriter printWriter = new PrintWriter(new FileWriter("example.txt"))) {       // 打印各种数据值的代码   } catch (IOException e) {       e.printStackTrace();   }

7. 对象流(Object)

对象流用于读写对象。

ObjectInputStream:用于读取对象的输入流。

ObjectInputStream objectInput = new ObjectInputStream(new FileInputStream("example.obj"));

Demo Code:

   try (ObjectInputStream objectInput = new ObjectInputStream(new FileInputStream("example.obj"))) {       // 读取对象的代码   } catch (IOException | ClassNotFoundException e) {       e.printStackTrace();   }

ObjectOutputStream:用于写入对象的输出流。

ObjectOutputStream objectOutput = new ObjectOutputStream(new FileOutputStream("example.obj"));

Demo Code:

   try (ObjectOutputStream objectOutput = new ObjectOutputStream(new FileOutputStream("example.obj"))) {       // 写入对象的代码   } catch (IOException e) {       e.printStackTrace();   }

8. 序列化流(SequenceInputStream)

用于将多个输入流串联起来,形成一个逻辑上的大输入流。

InputStream sequenceInput = new SequenceInputStream(input1, input2);

Demo Code:

   try (InputStream sequenceInput = new SequenceInputStream(input1, input2)) {       // 串联多个输入流的代码   } catch (IOException e) {       e.printStackTrace();   }

结语

本教程深入研究了Java流的基础概念、不同类型和常见应用场景。通过清晰的示例代码和详细的解释,读者可以更好地掌握Java流的使用。选择适当的流类型对于不同的数据操作至关重要。关注站长获取更多详情。


正文到此结束
本文目录