当前位置: 首页 > news >正文

讲解:Java I/O 流体系,并举例每个类的使用

Java I/O 流体系详解及各类使用示例

Java I/O(输入/输出)流体系是Java处理数据输入输出的核心API,提供了丰富的类库来支持各种数据源的读写操作。下面我将全面讲解Java I/O流体系,并为每个主要类提供具体的使用示例。

一、I/O流体系总体架构

Java I/O流主要分为两大类:

  1. 字节流(Byte Streams):以字节(8位)为单位进行读写

    • 核心抽象类:InputStreamOutputStream
  2. 字符流(Character Streams):以字符(16位Unicode)为单位进行读写

    • 核心抽象类:ReaderWriter

二、字节流体系详解与示例

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来处理各种输入输出需求:

  1. 字节流:处理二进制数据,核心类是InputStreamOutputStream
  2. 字符流:处理文本数据,核心类是ReaderWriter
  3. 装饰器模式:通过组合方式扩展功能(如缓冲、数据类型支持等)
  4. NIO:提供非阻塞I/O、内存映射文件等高效操作
  5. NIO.2:进一步简化文件操作,增加异步I/O支持

在实际开发中,应根据具体需求选择合适的I/O类和方法。对于文本处理优先使用字符流,二进制数据处理使用字节流,大文件或高性能需求考虑NIO。同时,使用try-with-resources语句确保资源正确释放。

相关文章:

  • 一站式万能邮箱:如何实现多平台邮件管理?
  • 使用绑定参数以防止SQL注入攻击
  • SpringBoot自动配置原理深度解析
  • Flutter:下拉框选择
  • 【Linux 学习计划】-- 进程程序替换
  • 硅基计划2.0 学习总结 陆 抽象类与接口
  • JavaWeb笔记
  • MySQL查询语句
  • pikachu靶场通关笔记17 CSRF关卡03-CSRF(Token)
  • [蓝桥杯]矩阵翻硬币
  • maven微服务${revision}依赖打包无法识别
  • 王自如走上了罗永浩的老路
  • 使用VTK还是OpenGL集成到qt程序里哪个好?
  • 马氏链(Markov Chain Model)模型知识详解(1)
  • 使用 espeak-ng 实现文本转语音
  • 基于 Vue 和 Spring Boot 实现滑块验证码的机器验证
  • Qwen2.5-VL - FFN(前馈神经网络)Feedforward Neural Network
  • Java持久层技术对比:Hibernate、MyBatis与JPA的选择与应用
  • npm error Cannot read properties of null (reading ‘matches‘)
  • mamba架构和transformer区别
  • 网站搜索排名高怎么做/哈尔滨最新
  • 重庆做网站建设公司排名/深圳刚刚突然宣布
  • 做网站用国内还是国外的vps/哪个推广网站好
  • 高端定制服装/搜索引擎技术优化
  • 网站建设对电子商务的作用/中国制造网
  • 网站智能云/长沙网络营销顾问