Java中IO 流分为几种?
概述
在Java中,流(Stream)是一种用于在程序间传输数据的抽象。流分为输入流和输出流,根据处理单位的不同,又分为字节流和字符流。本教程将深入探讨Java流的不同类型和功能,以及它们的应用场景。
输入流(Input)与输出流(Output)
流根据数据的流向可分为输入流和输出流。输入流用于将外部数据流入程序,输出流则用于将程序中的数据流出。
字节流与字符流
流根据处理单位可分为字节流和字符流。字节流以字节为单位进行输入输出,而字符流以字符为单位进行输入输出。字节流主要操作二进制数据,而字符流则主要用于操作文本数据。
字节流和字符流的主要区别在于,字节流一次处理一个字节(8位),而字符流一次处理一个字符(16位)。
在JDK中,字节流的类名通常以Stream
结尾,而字符流的类名通常以Reader
或Writer
结尾。
节点流与处理流
流还可以根据其在流结构中的角色分为节点流和处理流。
•节点流:直接与数据源相连,是直接进行数据读写的流。如FileInputStream
、FileOutputStream
等。•处理流:在节点流的基础上,再套接一层提供额外的功能。处理流不能独立存在,必须连接在节点流上。如BufferedInputStream
、BufferedOutputStream
等。
常用流的分类
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流的使用。选择适当的流类型对于不同的数据操作至关重要。关注站长获取更多详情。
- 本文标签: Java 面试题
- 本文链接: https://www.jietongc.com/article/344
- 版权声明: 本文由大熊科技原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权