Java IO 流:从字节到字符再到Java 装饰者模式(Decorator Pattern),解析与应用掌握数据流动的艺术

在 Java 编程中,IO(输入输出)流是处理数据输入输出的核心工具。无论是读取文件、网络通信,还是处理用户输入,IO 流都扮演着重要角色。本文将深入探讨 Java IO 流的核心概念、分类、经典代码实例及其应用场景,帮助你全面掌握数据流动的艺术。

1. Java IO 流的核心概念

1.1 什么是 IO 流?

IO 流是 Java 中用于处理输入输出数据的抽象概念。它可以将数据从一个地方(如文件、网络)传输到另一个地方(如内存、控制台)。

1.2 IO 流的分类

  • 按数据单位

    • 字节流:以字节为单位读写数据,适用于二进制文件(如图片、视频)。

    • 字符流:以字符为单位读写数据,适用于文本文件。

  • 按流向

    • 输入流:从外部读取数据到程序中。

    • 输出流:将程序中的数据写入外部。

2. Java IO 流的经典类

2.1 字节流

字节流主要用于处理二进制数据。Java 提供了 InputStreamOutputStream 作为字节流的基类。

  • InputStream:字节输入流的基类。

    • 常用实现类:FileInputStreamBufferedInputStream

  • OutputStream:字节输出流的基类。

    • 常用实现类:FileOutputStreamBufferedOutputStream

2.2 字符流

  • Reader:字符输入流的基类。

    • 常用实现类:FileReaderBufferedReader

  • Writer:字符输出流的基类。

    • 常用实现类:FileWriterBufferedWriter

3. 经典代码实例

3.1 字节流:文件复制

以下是一个使用字节流复制文件的示例:

//代码解读:
//使用 FileInputStream 读取源文件。
//
//FileOutputStream 写入目标文件。
//
//通过缓冲区 byte[] buffer 提高读写效率。//使用 try-with-resources 语法自动关闭流。import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class ByteStreamExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("source.txt");FileOutputStream fos = new FileOutputStream("target.txt")) {byte[] buffer = new byte[1024];int length;while ((length = fis.read(buffer)) != -1) {fos.write(buffer, 0, length);}System.out.println("文件复制完成!");} catch (IOException e) {e.printStackTrace();}}
}

3.2 字符流:文本文件读取

以下是一个使用字符流读取文本文件的示例:

//代码解读:
//使用 FileReader 读取文本文件。//使用 BufferedReader 包装 FileReader,提高读取效率。通过 readLine() 方法逐行读取文件内容。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class CharStreamExample {public static void main(String[] args) {try (BufferedReader br = new BufferedReader(new FileReader("source.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}

3.3 缓冲流:高效文件读写

以下是一个使用缓冲流读写文件的示例:

//使用 BufferedReader 和 BufferedWriter 包装字符流,提高读写效率。//通过 readLine() 和 write() 方法逐行读写文件。
import java.io.*;public class BufferedStreamExample {public static void main(String[] args) {try (BufferedReader br = new BufferedReader(new FileReader("source.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("target.txt"))) {String line;while ((line = br.readLine()) != null) {bw.write(line);bw.newLine();  // 写入换行符}System.out.println("文件读写完成!");} catch (IOException e) {e.printStackTrace();}}
}

3.4 对象流:序列化与反序列化

Java 提供 ObjectOutputStreamObjectInputStream 来进行对象的序列化和反序列化。

import java.io.*;class Person implements Serializable {private static final long serialVersionUID = 1L;private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + "}";}
}public class ObjectStreamExample {public static void main(String[] args) {String filePath = "person.ser";try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) {Person p = new Person("Alice", 25);oos.writeObject(p);} catch (IOException e) {e.printStackTrace();}try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) {Person p = (Person) ois.readObject();System.out.println("反序列化对象: " + p);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

 3.5 转换流:示例

转换流 适用于字节与字符的转换,支持编码格式转换。

import java.io.*;public class ConvertStreamExample {public static void main(String[] args) {try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("example.txt"), "UTF-8")) {osw.write("你好,世界!");} catch (IOException e) {e.printStackTrace();}try (InputStreamReader isr = new InputStreamReader(new FileInputStream("example.txt"), "UTF-8")) {int data;while ((data = isr.read()) != -1) {System.out.print((char) data);}} catch (IOException e) {e.printStackTrace();}}
}

 3.6 PrintStream 和 PrintWriter

import java.io.PrintStream;
import java.io.FileOutputStream;
import java.io.IOException;public class PrintStreamExample {public static void main(String[] args) {try (PrintStream ps = new PrintStream(new FileOutputStream("printStream.txt"))) {ps.println("Hello, PrintStream!");ps.printf("Formatted number: %.2f", 123.456);} catch (IOException e) {e.printStackTrace();}}
}
import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.IOException;public class PrintWriterExample {public static void main(String[] args) {try (PrintWriter pw = new PrintWriter(new FileWriter("printWriter.txt"))) {pw.println("Hello, PrintWriter!");pw.printf("Formatted text: %s", "Java IO");} catch (IOException e) {e.printStackTrace();}}
}

 4. 装饰者模式(Decorator Pattern)

在 Java 语言中,装饰者模式(Decorator Pattern) 是一种结构型设计模式,它允许动态地为对象添加新功能,而不改变其原始结构。在 Java 的 IO(输入/输出)系统中,装饰者模式被广泛应用,例如 BufferedReader 便是 Reader 的装饰者。

4.1. 装饰者模式概述

 装饰者模式的特点

  • 增强功能:在不修改原有类的情况下,动态添加新功能。

  • 符合开闭原则(OCP):对扩展开放,对修改封闭。

  • 支持递归组合:装饰者可以装饰另一个装饰者,实现更复杂的功能。

典型应用场景

  • Java IO(BufferedReader 装饰 FileReader 提高效率)。

  • 图形界面(BorderDecorator 装饰 Window 以增加边框)。

  • 数据加密(DataStream 装饰 FileStream 以增加加密功能)。

4.2 代码示例:基于装饰者模式的 Reader 设计

Decorator_pattern 目录下,我们设计了一组 Reader_ 类,它们模仿 Java IO 中的 Reader,并通过装饰者模式扩展其功能。

Reader_(抽象基类)

//作用://Reader_ 是抽象基类,定义了 read() 和 readLine() 方法。//允许子类继承,实现具体的读取方式。import java.io.Reader;
import java.io.IOException;abstract class Reader_ {protected Reader reader;public Reader_(Reader reader) {this.reader = reader;}public abstract int read() throws IOException;public abstract String readLine() throws IOException;public void close() throws IOException {reader.close();}
}

File_reader_(从文件读取数据)

//作用:
//
//直接从文件读取字符。//不支持 readLine(),需要 BufferedReader 进行封装。import java.io.FileReader;
import java.io.IOException;class File_reader_ extends Reader_ {public File_reader_(String filePath) throws IOException {super(new FileReader(filePath));}@Overridepublic int read() throws IOException {return reader.read();}@Overridepublic String readLine() throws IOException {throw new UnsupportedOperationException("FileReader 不支持 readLine");}
}

Buffered_reader_(增强 File_reader_,增加缓冲)

 

//作用://BufferedReader 的封装,提供 readLine() 方法。//装饰 File_reader_,增强其功能。class Buffered_reader_ extends Reader_ {private BufferedReader bufferedReader;public Buffered_reader_(Reader_ reader) {super(reader.reader);this.bufferedReader = new BufferedReader(reader);}@Overridepublic int read() throws IOException {return bufferedReader.read();}@Overridepublic String readLine() throws IOException {return bufferedReader.readLine();}
}

String_reader_(从字符串读取数据)

 

//作用://直接从 String 读取数据,而不是文件。
import java.io.StringReader;
import java.io.IOException;class String_reader_ extends Reader_ {public String_reader_(String data) {super(new StringReader(data));}@Overridepublic int read() throws IOException {return reader.read();}@Overridepublic String readLine() throws IOException {throw new UnsupportedOperationException("StringReader 不支持 readLine");}
}

Test(测试代码)

 

import java.io.IOException;public class Test {public static void main(String[] args) {try {System.out.println("读取文件示例:");Reader_ fileReader = new File_reader_("example.txt");Reader_ bufferedReader = new Buffered_reader_(fileReader);String line;while ((line = bufferedReader.readLine()) != null) {System.out.println(line);}bufferedReader.close();System.out.println("\n读取字符串示例:");Reader_ stringReader = new String_reader_("Hello, World!");int ch;while ((ch = stringReader.read()) != -1) {System.out.print((char) ch);}stringReader.close();} catch (IOException e) {e.printStackTrace();}}
}

 4.3 小结

通过装饰者模式,我们可以 灵活组合不同的 Reader_,增强功能。

5. IO 流的应用场景

5.1 文件操作

  • 读取、写入、复制、删除文件。

  • 示例:日志文件处理、配置文件读取。

5.2 网络通信

  • 通过 Socket 实现客户端和服务器之间的数据传输。

  • 示例:文件传输、实时聊天。

5.3 数据处理

  • 解析 CSV、JSON 等格式的数据。

  • 示例:数据导入导出、数据分析。

6. IO 流的最佳实践

6.1 使用缓冲流

  • 缓冲流(如 BufferedReaderBufferedInputStream)可以显著提高 IO 性能。

6.2 使用 try-with-resources

  • 确保流在使用后自动关闭,避免资源泄漏。

6.3 处理大文件

  • 对于大文件,使用分块读写(如 byte[] buffer)避免内存溢出。

7. 总结

Java IO 流是处理数据输入输出的核心工具,涵盖了字节流、字符流、缓冲流等多种类型。通过经典代码实例和最佳实践,本文帮助你全面掌握 IO 流的使用方法。无论是文件操作、网络通信,还是数据处理,IO 流都能为你提供强大的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38834.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS

目录 一 HTTPS是什么 二 加密 三 加密方案 四 CA机构/证书 五 最终方案(对称密钥/非对称密钥/CA证书)和总体流程 一 HTTPS是什么 在应用层存在SSL,TLS(HTTP之下,传输层之上)加密/解密安全协议,如果HTTP经过这个协议,对端也走…

StarRocks 主键(Primary Key)深度解析

一、StarRocks 产品简介 StarRocks 是一款高性能分析型数据库,专为海量数据的实时分析而设计。作为新一代湖仓(Lakehouse)加速引擎,StarRocks 融合了 MPP 架构和列式存储引擎的优势,能够支持亿级数据秒级查询响应。 …

(学习总结30)Linux 进程优先级、进程切换和环境变量

Linux 进程优先级、进程切换和环境变量 进程优先级基本概念查看系统进程PRI 和 NI 解释进程优先级调整命令行调整进程优先级调整新进程调度优先级命令 nice调整已运行进程调度优先级命令 renice 使用 top 调整进程优先级使用系统调用调整进程优先级 进程的竞争、独立、并行、并…

《Manus学习手册》.pdf(文末附完整版下载地址)

大家好,我是吾鳴。 吾鳴今天要给大家分享的一份比较全面详细的Manus学习手册,该学习手册主要包含Manus产品概述与核心理念、Manus功能与使用场景、Manus技术架构与工作流、Manus案例库与用户实践、邀请码获取与内测信息、Manus与传统AI对比与优势、用户评…

【MySQL】从零开始:掌握MySQL数据库的核心概念(三)

人生碌碌,竞短论长,却不道枯荣有数,得失难量。 前言 这是我自己学习MySQL数据库的第二篇博客总结。后期我会继续把MySQL数据库学习笔记开源至博客上。 上一期笔记是关于MySQL数据库的数据类型,没看的同学可以过去看看&#xff1a…

Web3智能合约与数据交互安全性探讨

Web3智能合约与数据交互安全性探讨 随着区块链技术的飞速发展,Web3的概念已经成为技术圈的热门话题。Web3不仅仅是技术迭代,它代表了一种全新的互联网交互方式,其中智能合约扮演着核心角色。智能合约是自动执行、控制或文档化法律事件和行动…

人工智能赋能山西乡村振兴:智能空间规划与可持续发展

摘要:随着人工智能技术的快速发展,山西乡村振兴面临着从传统农业到智能化现代化转型的重大机遇。本文探讨了人工智能在山西乡村振兴中的具体应用,重点分析了智能空间规划、生态保护与环境治理、产业转型以及基础设施升级的可能路径。文章从数…

QT三 自定义控件

一 自定义控件 现在的需求是这样: 假设我们要在QWidget 上做定制,这个定制包括了关于 一些事件处理,意味着要重写QWidget的一些代码,这是不实际的,因此我们需要自己写一个MyWidget继承QWidget,然后再MyWi…

【C++ 进阶】语句:从基础到实践

目录 一、输入输出体系的范式革命 1.1 C语言的格式化 1.2 C的流抽象革命 二、字符串处理的抽象跃迁 2.1 C语言的字符指针 2.2 C的string类革命 三、结构体到类的类型系统进化 3.1 C语言的结构体局限 3.2 C类的革命性演进 四、基础控制语句差异 4.1 条件语句&#xf…

C语言操作符

🌟 各位看官好,我是maomi_9526! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C语言的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更…

PostgreSQL:语言基础与数据库操作

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

KMP算法

KMP算法 为什么叫做KMP呢。 因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP next数组就是一个前缀表(prefix table)。 前缀表是用来回退的,它记录了模式串与…

3D点云数据处理中的聚类算法总结

1.欧式聚类: 基于点的空间距离(欧几里得距离)来分割点云,将距离较近的点归为同一簇。 欧式聚类需要的参数:邻域半径R,簇的最小点阈值minPts,最大点数阈值maxPts。 实现效率: O(n * log n) 实现…

WRC世界机器人大会-2024年展商汇总

2024世界机器人大会 时间:2024年8月21日至25日 地点:北京经济技术开发区北人亦创国际会展中心 大会主题:共育新质生产力,共享智能新未来 2024世界机器人博览会亮点纷呈,20余款人形机器人整机将亮相博览会&#xff…

拉取镜像,推送到阿里云镜像仓库

需求背景:在学习k8s,虚拟机无法正常拉取 wangyanglinux/tools:busybox 镜像。 解决办法:将墙外镜像拉到国内(阿里云)再使用 准备工作需要创建对应的镜像仓库,然后再进行推送 1. 拉取镜像 docker pull …

DeepSeek和Kimi在Neo4j中的表现

以下是2个最近爆火的人工智能工具, DeepSeek:DeepSeek Kimi: Kimi - 会推理解析,能深度思考的AI助手 1、提示词: 你能帮我生成一个知识图谱吗,等一下我会给你一篇文章,帮我从内容中提取关键要素,然后以N…

哈尔滨工业大学DeepSeek公开课人工智能:大模型原理 技术与应用-从GPT到DeepSeek|附视频下载方法

导 读INTRODUCTION 今天继续哈尔滨工业大学车万翔教授带来了一场主题为“DeepSeek 技术前沿与应用”的报告。 本报告深入探讨了大语言模型在自然语言处理(NLP)领域的核心地位及其发展历程,从基础概念出发,延伸至语言模型在机器翻…

redis解决缓存穿透/击穿/雪崩

文章目录 1.缓存穿透1.1 概念1.2 解决方案1.2.1 缓存空对象1.2.2 布隆过滤 1.2 店铺查询使用缓存穿透解决方案1.2.1 流程 2.缓存雪崩2.1 什么是缓存雪崩?2.2 雪崩解决方案 3.缓存击穿3.1 什么是缓存击穿?3.2解决方案3.2.1 基于互斥锁解决缓存击穿问题&am…

不连续平面提取

不连续平面提取 提取流程 #mermaid-svg-Y87uP8WsVRmPYriG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Y87uP8WsVRmPYriG .error-icon{fill:#552222;}#mermaid-svg-Y87uP8WsVRmPYriG .error-text{fill:#552222;s…

大语言模型-2.2/3-主流模型架构与新型架构

简介 本博客内容是《大语言模型》一书的读书笔记,该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品,覆盖大语言模型训练与使用的全流程,从预训练到微调与对齐,从使用技术到评测应用,帮助学员全面掌握大语言模型的…