讲解:Java I/O 流体系,并举例每个类的使用
Java I/O 流体系详解及各类使用示例
Java I/O(输入/输出)流体系是Java处理数据输入输出的核心API,提供了丰富的类库来支持各种数据源的读写操作。下面我将全面讲解Java I/O流体系,并为每个主要类提供具体的使用示例。
一、I/O流体系总体架构
Java I/O流主要分为两大类:
-
字节流(Byte Streams):以字节(8位)为单位进行读写
- 核心抽象类:
InputStream
和OutputStream
- 核心抽象类:
-
字符流(Character Streams):以字符(16位Unicode)为单位进行读写
- 核心抽象类:
Reader
和Writer
- 核心抽象类:
二、字节流体系详解与示例
1. 输入流(InputStream)体系
(1) FileInputStream - 文件字节输入流
// 读取文件内容到字节数组
try (InputStream is = new FileInputStream("test.txt")) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = is.read(buffer)) != -1) {System.out.write(buffer, 0, bytesRead);}
} catch (IOException e) {e.printStackTrace();
}
(2) ByteArrayInputStream - 字节数组输入流
byte[] data = "Hello World".getBytes();
try (InputStream is = new ByteArrayInputStream(data)) {int content;while ((content = is.read()) != -1) {System.out.print((char) content);}
}
(3) BufferedInputStream - 缓冲字节输入流
// 使用缓冲提高读取效率
try (InputStream is = new BufferedInputStream(new FileInputStream("largefile.dat"))) {byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = is.read(buffer)) != -1) {// 处理数据}
}
(4) DataInputStream - 基本数据类型输入流
// 读取基本数据类型
try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) {int i = dis.readInt();double d = dis.readDouble();boolean b = dis.readBoolean();System.out.println(i + ", " + d + ", " + b);
}
(5) ObjectInputStream - 对象反序列化流
// 反序列化对象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"))) {Person person = (Person) ois.readObject();System.out.println(person);
} catch (ClassNotFoundException e) {e.printStackTrace();
}
2. 输出流(OutputStream)体系
(1) FileOutputStream - 文件字节输出流
// 写入字节到文件
try (OutputStream os = new FileOutputStream("output.txt")) {byte[] data = "Hello Java IO".getBytes();os.write(data);
}
(2) ByteArrayOutputStream - 字节数组输出流
// 将数据写入内存中的字节数组
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {baos.write("Hello".getBytes());baos.write(" World".getBytes());byte[] result = baos.toByteArray();System.out.println(new String(result));
}
(3) BufferedOutputStream - 缓冲字节输出流
// 使用缓冲提高写入效率
try (OutputStream os = new BufferedOutputStream(new FileOutputStream("largefile.dat"))) {for (int i = 0; i < 100000; i++) {os.write(i);}
}
(4) DataOutputStream - 基本数据类型输出流
// 写入基本数据类型
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) {dos.writeInt(123);dos.writeDouble(3.14);dos.writeBoolean(true);
}
(5) ObjectOutputStream - 对象序列化流
// 序列化对象
Person person = new Person("张三", 25);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {oos.writeObject(person);
}
(6) PrintStream - 格式化输出流
// 格式化输出
try (PrintStream ps = new PrintStream("print.txt")) {ps.println("Hello PrintStream");ps.printf("PI = %.2f", Math.PI);
}
三、字符流体系详解与示例
1. 读取流(Reader)体系
(1) InputStreamReader - 字节流转字符流
// 将字节流转换为字符流
try (Reader reader = new InputStreamReader(new FileInputStream("text.txt"), "UTF-8")) {int data;while ((data = reader.read()) != -1) {System.out.print((char) data);}
}
(2) FileReader - 文件字符输入流
// 读取文本文件
try (Reader reader = new FileReader("text.txt")) {char[] buffer = new char[1024];int charsRead;while ((charsRead = reader.read(buffer)) != -1) {System.out.print(new String(buffer, 0, charsRead));}
}
(3) BufferedReader - 缓冲字符输入流
// 逐行读取文本文件
try (BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}
}
(4) StringReader - 字符串读取流
// 从字符串读取
String data = "Hello StringReader";
try (Reader reader = new StringReader(data)) {int ch;while ((ch = reader.read()) != -1) {System.out.print((char) ch);}
}
2. 写入流(Writer)体系
(1) OutputStreamWriter - 字符流转字节流
// 将字符流写入字节流
try (Writer writer = new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8")) {writer.write("Hello OutputStreamWriter");
}
(2) FileWriter - 文件字符输出流
// 写入文本文件
try (Writer writer = new FileWriter("output.txt")) {writer.write("Hello FileWriter");
}
(3) BufferedWriter - 缓冲字符输出流
// 高效写入文本文件
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {bw.write("Line 1");bw.newLine();bw.write("Line 2");
}
(4) StringWriter - 字符串写入流
// 将数据写入字符串
try (StringWriter sw = new StringWriter()) {sw.write("Hello ");sw.write("StringWriter");String result = sw.toString();System.out.println(result);
}
(5) PrintWriter - 格式化字符输出流
// 格式化输出到文件
try (PrintWriter pw = new PrintWriter("print.txt")) {pw.println("Hello PrintWriter");pw.printf("Today is %tF", new Date());
}
四、NIO (New I/O) 示例
1. 文件复制(NIO)
Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");
try {Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {e.printStackTrace();
}
2. 使用Channel和Buffer读取文件
try (FileChannel channel = FileChannel.open(Paths.get("data.txt"))) {ByteBuffer buffer = ByteBuffer.allocate(1024);while (channel.read(buffer) > 0) {buffer.flip();while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}buffer.clear();}
}
五、Java 7 NIO.2 增强示例
1. 遍历目录
Path dir = Paths.get(".");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {for (Path entry : stream) {System.out.println(entry.getFileName());}
}
2. 异步文件读取
AsynchronousFileChannel channel = AsynchronousFileChannel.open(Paths.get("largefile.txt"));
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() {@Overridepublic void completed(Integer result, ByteBuffer attachment) {System.out.println("Read completed: " + result + " bytes");}@Overridepublic void failed(Throwable exc, ByteBuffer attachment) {exc.printStackTrace();}});
六、总结
Java I/O流体系提供了丰富的API来处理各种输入输出需求:
- 字节流:处理二进制数据,核心类是
InputStream
和OutputStream
- 字符流:处理文本数据,核心类是
Reader
和Writer
- 装饰器模式:通过组合方式扩展功能(如缓冲、数据类型支持等)
- NIO:提供非阻塞I/O、内存映射文件等高效操作
- NIO.2:进一步简化文件操作,增加异步I/O支持
在实际开发中,应根据具体需求选择合适的I/O类和方法。对于文本处理优先使用字符流,二进制数据处理使用字节流,大文件或高性能需求考虑NIO。同时,使用try-with-resources语句确保资源正确释放。