2025/7/15——java学习总结

Java IO、Stream、异常与 File 全体系总结:从基础到进阶的完整突破

一、核心知识深耕:四大模块的体系与底层逻辑

(一)IO 流:数据传输的基础通道

  1. 体系架构与核心分类

    • 按流向:输入流(InputStream/Reader)、输出流(OutputStream/Writer)。
    • 按数据单位
      • 字节流:处理所有数据(二进制、文本),核心类 FileInputStream/FileOutputStream
      • 字符流:处理文本数据(自动编码转换),核心类 FileReader/FileWriterInputStreamReader(指定编码)。
    • 按角色
      • 节点流:直接操作数据源(如 FileInputStream)。
      • 处理流:增强节点流功能(如 BufferedInputStream 加缓冲、ObjectInputStream 序列化)。
  2. 核心方法与特性

    • 字节流:read()/write()(单字节或字节数组)。
    • 字符流:read()/write()(字符或字符数组)、BufferedReader.readLine()(按行读取)。
    • 资源管理:实现 AutoCloseable 接口,支持 try-with-resources 自动关闭。

(二)Java 8 Stream:集合数据的高效处理

  1. 核心概念与特性

    • 定义:基于数据源(集合、数组)的元素序列,支持声明式操作(过滤、映射、聚合等)。
    • 特性
      • 惰性执行:中间操作(如 filter)仅记录逻辑,终端操作(如 collect)才触发执行。
      • 一次性消费:流只能遍历一次,再次使用需重新创建。
      • 并行处理:通过 parallelStream() 实现多线程并行操作。
  2. 操作分类

    • 中间操作(返回新流):
      • 过滤:filter(Predicate)
      • 映射:map(Function)flatMap(Function)(将流扁平化)
      • 排序:sorted()sorted(Comparator)
    • 终端操作(返回非流结果):
      • 聚合:collect(Collector)(如 Collectors.toList())、count()max(Comparator)
      • 遍历:forEach(Consumer)
      • 匹配:anyMatch(Predicate)allMatch(Predicate)

(三)异常处理:程序容错的核心机制

  1. 异常体系结构

    • 顶层父类Throwable,分为:
      • Error:虚拟机错误(如 OutOfMemoryError),无法处理,需避免。
      • Exception:程序可处理的异常,分为:
        • 编译时异常(Checked):如 IOExceptionClassNotFoundException,必须显式处理。
        • 运行时异常(Unchecked):如 NullPointerExceptionIndexOutOfBoundsException,继承自 RuntimeException,可选择处理。
  2. 异常处理方式

    • 捕获try-catch-finally 块,finally 用于释放资源(如流关闭)。
    • 声明抛出throws 关键字,将异常交给上层处理。
    • 自定义异常:继承 Exception 或 RuntimeException,封装业务异常信息。

(四)File 类:文件系统的抽象表示

  1. 核心功能

    • 表示文件或目录的路径(不直接操作文件内容)。
    • 关键方法:
      • 路径操作:getAbsolutePath()getPath()getName()
      • 存在性判断:exists()isFile()isDirectory()
      • 创建 / 删除:createNewFile()mkdirs()(多级目录)、delete()
      • 列表获取:list()(文件名数组)、listFiles()(File 对象数组)。
  2. 路径特性

    • 绝对路径:从根目录开始(如 C:/test/file.txt)。
    • 相对路径:相对于当前工作目录(如 src/main/java)。
    • 跨平台兼容:通过 File.separator 替代硬编码的 / 或 \

二、实践突破:四大模块的场景化应用

(一)IO 流实战:文件处理与编码控制

1. 大文件拷贝(缓冲流优化)

java

public class LargeFileCopy {public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();// 缓冲流 + 大字节数组提升效率try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("source.iso"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("target.iso"))) {byte[] buffer = new byte[8192 * 4]; // 32KB缓冲区int len;while ((len = bis.read(buffer)) != -1) {bos.write(buffer, 0, len);}}System.out.println("拷贝完成,耗时:" + (System.currentTimeMillis() - start) + "ms");}
}
2. 字符流处理编码(避免乱码)

java

public class EncodingHandler {public static void main(String[] args) {String content = "Java IO流与编码处理";String path = "encoding_test.txt";// 用UTF-8编码写入try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8);BufferedWriter bw = new BufferedWriter(osw)) {bw.write(content);} catch (IOException e) {e.printStackTrace();}// 用UTF-8解码读取try (InputStreamReader isr = new InputStreamReader(new FileInputStream(path), StandardCharsets.UTF_8);BufferedReader br = new BufferedReader(isr)) {String line;while ((line = br.readLine()) != null) {System.out.println("读取内容:" + line);}} catch (IOException e) {e.printStackTrace();}}
}

(二)Stream API 实战:集合数据处理

1. 复杂对象集合处理

java

class User {private String name;private int age;private String city;// 构造器、getter省略
}public class StreamDemo {public static void main(String[] args) {List<User> users = Arrays.asList(new User("张三", 25, "北京"),new User("李四", 30, "上海"),new User("王五", 28, "北京"),new User("赵六", 35, "广州"));// 需求:筛选北京的用户,按年龄排序,提取姓名并拼接String result = users.stream().filter(u -> "北京".equals(u.getCity())) // 过滤北京用户.sorted(Comparator.comparingInt(User::getAge)) // 按年龄排序.map(User::getName) // 提取姓名.collect(Collectors.joining(",", "北京用户:", "。")); // 拼接System.out.println(result); // 输出:北京用户:张三,王五。}
}
2. 并行流处理大数据量

java

public class ParallelStreamDemo {public static void main(String[] args) {// 生成1000万个随机数List<Integer> numbers = new ArrayList<>(10_000_000);Random random = new Random();for (int i = 0; i < 10_000_000; i++) {numbers.add(random.nextInt(1000));}// 并行流计算偶数之和long start = System.currentTimeMillis();long sum = numbers.parallelStream().filter(n -> n % 2 == 0).mapToLong(Integer::longValue).sum();System.out.println("偶数和:" + sum + ",耗时:" + (System.currentTimeMillis() - start) + "ms");}
}

(三)异常处理实战:优雅的错误控制

1. 多异常捕获与资源自动关闭

java

public class ExceptionHandling {public static void readFile(String path) {// try-with-resources自动关闭资源,多异常用|分隔try (BufferedReader br = new BufferedReader(new FileReader(path))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}} catch (FileNotFoundException e) {System.err.println("文件不存在:" + path);} catch (IOException e) {System.err.println("读取失败:" + e.getMessage());}}
}
2. 自定义异常与异常链

java

// 自定义业务异常
class InsufficientFundsException extends Exception {public InsufficientFundsException(String message) {super(message);}
}public class CustomExceptionDemo {public static void withdraw(double amount) throws InsufficientFundsException {double balance = 1000;if (amount > balance) {// 包装原始异常为自定义异常throw new InsufficientFundsException("余额不足,当前余额:" + balance);}}public static void main(String[] args) {try {withdraw(1500);} catch (InsufficientFundsException e) {e.printStackTrace();// 处理业务异常}}
}

(四)File 类实战:文件系统操作

1. 递归遍历目录并统计文件类型

java

public class FileTraversal {public static void main(String[] args) {File dir = new File("D:/project");Map<String, Integer> typeCount = new HashMap<>();traverse(dir, typeCount);// 输出统计结果typeCount.forEach((type, count) -> System.out.println(type + "文件:" + count + "个"));}private static void traverse(File file, Map<String, Integer> typeCount) {if (file.isDirectory()) {File[] children = file.listFiles();if (children != null) { // 避免空指针for (File child : children) {traverse(child, typeCount);}}} else {// 获取文件后缀String name = file.getName();int dotIndex = name.lastIndexOf('.');String type = (dotIndex == -1) ? "无后缀" : name.substring(dotIndex);// 更新计数typeCount.put(type, typeCount.getOrDefault(type, 0) + 1);}}
}
2. 文件批量重命名

java

public class FileRename {public static void main(String[] args) {File dir = new File("D:/photos");File[] files = dir.listFiles(f -> f.isFile() && f.getName().endsWith(".jpg"));if (files != null) {for (int i = 0; i < files.length; i++) {File oldFile = files[i];String newName = "travel_" + (i + 1) + ".jpg";File newFile = new File(dir, newName);if (oldFile.renameTo(newFile)) {System.out.println("重命名成功:" + newName);}}}}
}

三、底层原理:四大模块的运行机制

(一)IO 流的底层实现

  1. 字节流与系统调用

    • FileInputStream.read() 最终调用 native 方法(如 read0()),通过操作系统内核读取文件数据。
    • 缓冲流(BufferedInputStream)内部维护字节数组缓冲区,减少系统调用次数(一次读取 8KB,而非单字节)。
  2. 字符流的编码转换

    • InputStreamReader 使用 CharsetDecoder 将字节按指定编码(如 UTF-8)解码为字符。
    • 多字节字符(如中文)需连续读取完整字节序列,否则会产生乱码。

(二)Stream API 的执行原理

  1. 惰性求值机制

    • 中间操作(如 filter)仅构建操作管道,不实际执行。
    • 终端操作(如 collect)触发整个管道执行,采用流水线方式处理元素。
  2. 并行流实现

    • 基于 Fork/Join 框架,将数据源拆分为多个子任务,通过多线程并行处理。
    • 适用于 CPU 密集型任务,IO 密集型任务并行优势不明显。

(三)异常处理的底层机制

  1. 异常表与栈跟踪

    • 编译期生成异常表,记录 try-catch 块的范围和处理的异常类型。
    • 异常抛出时,JVM 通过异常表查找匹配的 catch 块,若未找到则终止线程并打印栈跟踪(printStackTrace())。
  2. try-with-resources 原理

    • 编译器自动生成 finally 块,调用资源的 close() 方法,确保资源释放。
    • 多个资源按声明逆序关闭(先关最后声明的资源)。

(四)File 类与文件系统交互

  1. 路径解析

    • 依赖操作系统的文件系统接口,将抽象路径转换为系统实际路径。
    • 相对路径解析基于 user.dir 系统属性(程序运行目录)。
  2. 文件操作的原子性

    • renameTo() 方法在不同文件系统间可能非原子操作,可能导致文件丢失。
    • 目录删除(delete())仅支持空目录,非空目录需递归删除子文件。

四、总结与展望:从整合到进阶

今日突破

  • 知识整合:贯通 IO 流(数据传输)、Stream(数据处理)、异常(容错机制)、File(文件系统)四大模块,形成完整的数据处理链路。
  • 实践能力:掌握大文件高效处理、编码控制、集合流处理优化、异常优雅处理、文件系统批量操作等实战技能。
  • 底层认知:理解 IO 流的系统调用、Stream 的惰性执行、异常表机制、File 与操作系统交互等底层逻辑。

后续进阶方向

  1. NIO 与异步 IO

    • 学习 java.nio 包的通道(Channel)、缓冲区(Buffer)、选择器(Selector),掌握非阻塞 IO 模型。
    • 异步 IO(AsynchronousFileChannel)提升高并发场景下的性能。
  2. Stream 高级应用

    • 自定义收集器(Collector)处理复杂聚合逻辑。
    • 流的并行策略优化(如 Spliterator 自定义拆分)。
  3. 异常处理模式

    • 学习异常转译(将底层异常转为业务异常)、异常重试机制、全局异常处理器(如 Spring 的 @ControllerAdvice)。
  4. 文件系统高级操作

    • 学习 java.nio.file 包(PathFilesFileSystem),支持更丰富的文件操作(如文件属性、符号链接)。

通过四大模块的协同学习,不仅能应对日常开发中的数据处理需求,更能深入理解 Java 的 IO 模型、函数式编程、容错设计等核心思想,为高性能、高可靠性的 Java 应用开发奠定基础 ✨。

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

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

相关文章

【轨物方案】当补贴退潮,光伏电站如何回归价值本质?

中国光伏产业正站在一个历史性的拐点。过去&#xff0c;国家补贴的“黄金时代”催生了装机量的爆发式增长&#xff0c;许多电站在建设初期将重心放在了快速并网&#xff0c;却忽视了贯穿2-30年生命周期的运维规划。如今&#xff0c;补贴浪潮逐渐退去&#xff0c;各大企业开始从…

群晖Nas - Docker(ContainerManager)上安装SVN Server和库权限设置问题

上次安装了Gitlab&#xff0c;可以参考这篇&#xff08;群晖Nas - Docker&#xff08;ContainerManager&#xff09;上安装GitLab&#xff09;&#xff0c;今天来搞SVN服务器&#xff0c;废话不多说。 下载镜像 还是先下载镜像&#xff08;garethflowers/svn-server&#xff…

前端打包自动压缩为zip--archiver

安装依赖 pnpm add archiver types/archiver/vitePlugins/autoBuildZip.ts import { Plugin } from vite; import archiver from archiver; import fs from fs;const compressFolder (folderPath: string, outputFilePath: string) > {const output fs.createWriteStream(…

React响应式组件范式:从类组件到Hooks

​引言 在UI开发中&#xff0c;"状态变化自动触发UI更新"的响应式机制是构建动态界面的核心。React通过独特的​​单向数据流​​和​​虚拟DOM&#xff08;Virtual DOM&#xff09;​​ 实现这一目标&#xff0c;但类组件&#xff08;Class Components&#xff09;…

com2tcp工具

com2tcp 是 com0com 套件中的一个实用工具&#xff0c;用于将本地串口&#xff08;COM&#xff09;数据转发到 TCP/IP 网络&#xff0c;或者将 TCP/IP 数据转发到本地串口&#xff0c;实现串口数据的网络透传。 1. com2tcp 基本用法 &#xff08;1&#xff09;安装 com0com 从…

MySQL实操:将Word表格数据导入MySQL表

文章目录 1. 提出任务1.1 Word表格数据1.2 查看商品空表1.3 任务要求2. 完成任务2.1 借助AI2.1.1 利用AI生成SQL语句2.1.2 在Navicat里执行查询2.1.3 查看商品表记录2.2 借助Excel2.2.1 将Word表格数据复制到Excel2.2.2 新建商品表2.2.3 利用导入向导将电子表格数据导入商品表2…

什么是Podman?能否替代Docker?Podman快速入门

什么是PodmanPodman&#xff08;POD Manager&#xff09;是一个开源的无守护进程&#xff08;daemonless&#xff09;容器引擎&#xff0c;用于管理容器、容器镜像、容器卷和网络。它兼容 OCI 标准&#xff0c;可以运行 Docker 镜像&#xff0c;并且设计上与 Docker CLI 命令高…

开通保存图片权限

直接粘贴就可以用 上干货 可以的话希望点个start/* 小程序特有相关 */mp-weixin: {appid: VITE_WX_APPID,setting: {urlCheck: false,minified : true //是否压缩js},usingComponents: true,"lazyCodeLoading": "requiredComponents", //按需注入"pe…

【赵渝强老师】大数据交换引擎Sqoop

Sqoop是SQL To Hadoop的简称&#xff0c;它是一款开源的工具&#xff0c;主要用于在Hadoop&#xff08;Hive&#xff09;与传统的数据库&#xff08;Oracle、MySQL等&#xff09;间进行数据的传递。通过使用Sqoop可以将一个关系型数据库中的数据导进到Hadoop的HDFS中&#xff0…

C++进阶-map的应用

目录 1.预备知识 2.map的补充知识 2.1map的插入方式 2.2访问键和值 2.3map::operator[]的补充 2.4另外一些map的成员函数的补充 3.map的应用实践-力扣刷题-前k个高频单词 3.1解法1 3.2解法2 3.3解法3 4.map的应用实践-力扣刷题-随机链表的复制 4.1C语言解法 4.2C解…

【三维重建工具】NeRFStudio、3D GaussianSplatting、Colmap安装与使用指南

目录 一、NeRFStudio安装1.安装&#xff08;ubuntu系统&#xff09;2.安装&#xff08;windows系统&#xff09; 二、安装tinycudann三、Colmap安装与使用1. 安装依赖2. 安装colmap3.使用colmap3.1 可视化界面使用3.2 Nerfstudio命令行调用Colmap3.3 colmap结果不准时的修复3.4…

Mybatis05-动态sql

一、应用场景MyBatis 的 动态 SQL 是指根据不同的条件动态拼接生成 SQL 语句的能力。它的最大优势是&#xff1a;避免写多个 XML 映射语句、避免 SQL 冗余、提升代码复用性和可维护性。示例1&#xff1a;用户可以通过勾选框&#xff0c;勾选不同的数据进行批量删除&#xff0c;…

VSCODE 选中多行 需要同时按住alt键才可以

在 VS Code 中&#xff0c;如果你发现 必须按住 Alt 键才能选中多行&#xff08;即“列选择”或“块选择”模式&#xff09;&#xff0c;而直接拖动鼠标无法多选&#xff0c;可能是由于以下原因导致的&#xff1a;1. 检查是否启用了“列选择模式”VS Code 默认情况下&#xff1…

2025前端面试真题以及答案-不断整理中,问题来源于牛客真题

一、 项目内存泄露react与vue的渲染机制有哪些不同react fiber架构vue2与3&#xff0c;为什么用proxy代替defineproperty性能优化有哪些三栏布局实现方式重排与重绘一个对话聊天框如何减少重排&#xff08;我回答的是绝对定位&#xff0c;将聊天框定位在下面&#xff0c;类似于…

雷军的 IP 革命:人格化力量如何重塑商业规则|创客匠人

小米 YU7 发布会 3 分钟售罄 20 万台的奇迹&#xff0c;撕开了一个时代真相&#xff1a;当商业竞争进入深水区&#xff0c;决定胜负的不再是产品参数&#xff0c;而是创始人 IP 的人格穿透力。雷军仅凭个人影响力撬动数十亿级交易&#xff0c;这绝非偶然&#xff0c;而是人格化…

SpringBoot3:应对C10K并发挑战的优化指南

嘿&#xff0c;哥们&#xff01;还在为服务的并发量上不去而头疼吗&#xff1f;用户量一上来&#xff0c;CPU、内存就告急&#xff0c;接口响应慢得像蜗牛&#xff1f;别慌&#xff0c;今天我们就来盘一盘&#xff0c;怎么用最新的Spring Boot 3&#xff0c;把服务性能调教到极…

响应式编程入门教程第三节:ReactiveCommand 与 UI 交互

响应式编程入门教程第一节&#xff1a;揭秘 UniRx 核心 - ReactiveProperty - 让你的数据动起来&#xff01; 响应式编程入门教程第二节&#xff1a;构建 ObservableProperty&#xff1c;T&#xff1e; — 封装 ReactiveProperty 的高级用法 响应式编程入门教程第三节&#x…

500+技术栈覆盖:Web测试平台TestComplete的对象识别技术解析

在用户界面&#xff08;UI&#xff09;测试领域&#xff0c;传统的测试工具往往依赖于XPath或CSS选择器来定位页面元素。然而&#xff0c;在面对动态变化的界面、多语言支持或是跨越多种技术框架的应用时&#xff0c;这些传统方法常导致脚本失效&#xff0c;增加了维护成本。 …

研究人员利用提示注入漏洞绕过Meta的Llama防火墙防护

Trendyol应用安全团队发现了一系列绕过技术&#xff0c;使得Meta的Llama防火墙在面对复杂的提示注入攻击时防护失效。这一发现引发了人们对现有大语言模型&#xff08;LLM&#xff09;安全措施准备情况的担忧&#xff0c;并凸显出在企业日益将大语言模型嵌入工作流程时&#xf…

Shell 脚本系统学习 · 第5篇:多命令顺序执行的三种方式详解(`;`、``、`||`)

在日常的 Linux 运维与脚本编写中&#xff0c;我们经常需要依次执行多条命令。本篇将带你彻底搞懂三种命令顺序执行方式&#xff1a;;、&& 和 ||&#xff0c;并通过实用示例掌握它们的区别与应用场景。一、为什么要了解多命令执行方式&#xff1f; 在实际运维或脚本编写…