本文介绍了在 Java 中使用 `ZipInputStream` 读取 ZIP 文档的基本方法。首先在 Maven 中加入 `commons-io` 依赖,然后通过 `ZipFile` 与 `ZipInputStream`(指定 GBK 编码)打开压缩包,使用 `getNextEntry()` 循环遍历每个 `ZipEntry`,打印路径并对非目录且以 `.txt` 结尾的文件读取内容,利用 `IOUtils.readLines` 将流转为字符串列表。代码示例展示了完整的文件读取、文本输出以及资源的安全关闭,运行后可在控制台打印出压缩包内所有文件及 txt 文件内容。

JDK 动态代理只能为实现接口的类生成代理,依赖 InvocationHandler 与反射,适用于有接口的目标对象;CGLIB 通过 ASM 生成目标类的子类,覆盖非 final 方法,可对没有接口的类进行代理。Spring 默认对实现接口的 bean 使用 JDK 代理,未实现接口时使用 CGLIB,也可在配置中强制使用 CGLIB。JDK 代理在 JDK6 以后性能得到优化,少量调用时更快;大量调用时 CGLIB 仍有优势,但在 JDK8 之后 JDK 已超越。CGLIB 不能代理 final 类或方法,且需额外库。两者的实现原理、使用场景及性能差异如上。

在 Java 开发中,应尽量复用对象、避免重复创建。使用字面量而非 `new String` 可让字符串进入常量池,减少内存与时间开销;字符串拼接应选用 `StringBuilder`(单线程)或 `StringBuffer`(线程安全),而非不变的 `String`。`Boolean` 同理,推荐 `Boolean.valueOf()`,因为它直接返回预定义的 `TRUE/FALSE` 实例,避免新对象。基本类型比包装类更高效,尽量避免自动装箱/拆箱导致的额外对象创建。正则匹配时应先 `Pattern.compile` 再复用 `Matcher`,不要在循环中调用 `String.matches` 反复编译正则,可提升数倍性能。通过这些细节可显著降低内存占用并提升运行速度。

文章指出手动在 finally 中关闭 I/O 流代码冗长且易漏,推荐使用 Java 7 的 try‑with‑resources,它要求资源实现 AutoCloseable,能够自动安全地释放资源,代码更简洁、可读性更高。文中还提供了一个接受可变 Closeable 参数的统一关闭方法,强调释放顺序的重要性,但最终结论是:在可用时仍应首选 try‑with‑resources 以实现优雅的资源管理。

线程池通过维护固定数量的Worker线程实现复用。execute()先尝试在核心线程数内创建Worker,若已达上限则把任务放入队列;Worker 在构造时创建并绑定真实Thread,run() 调用 runWorker()。runWorker() 在一个 while 循环中不断从 firstTask 或工作队列获取 Runnable 并直接执行 task.run(),而不再创建新线程。线程只在首次 start 后进入循环,随后循环获取并执行后续任务,直至池关闭,从而实现线程的重复利用,避免频繁的创建与销毁开销。

文章说明在并发事务下会出现脏写、脏读、不可重复读和幻读四类问题,并阐释其产生原因:事务未提交就被其他事务读取或修改导致数据回滚或不一致。随后介绍数据库通过事务隔离级别(READ‑UNCOMMITTED、READ‑COMMITTED、REPEATABLE‑READ、SERIALIZABLE)以及锁、MVCC 等机制来防止这些现象,并指出 MySQL 默认采用 REPEATABLE‑READ。