知其然,知其所以然
Java 内部原理 2026-10-04

DecimalFormat:数字格式化的 Locale 与线程安全

在 JDK 21 上验证 DecimalFormat:模式语法;默认 HALF_EVEN 与 double 的二进制误差(1.005 → 1.00,BigDecimal 得 1.01);parse(“12abc”) 返回 12 不抛异常;Locale 错位解析 “1.234”(de_DE 得 1234);紧凑数字格式;8 线程共用实例 format 四种输入 0 次出错,但 parse 80 万次里 29 万次结果错误并抛异常,并发改设置出现乱码。

Java DecimalFormat NumberFormat Locale 舍入 线程安全 真实验证 动画演示
Java 内部原理 2026-10-04

ResourceBundle:国际化资源的查找与回退

在 JDK 21 上验证 ResourceBundle:候选 Locale 列表(zh-CN 会先试 zh_CN_#Hans);默认 Locale 插进回退链(默认 fr 时请求 en 得到 français,NO_FALLBACK 才得到根);properties 读取默认 UTF-8 并在遇到非法字节时按 Latin-1 重读,但 0xE9 恰在文件末尾时抛 MissingResourceException;类 bundle 压过同名 properties;缓存默认永不过期,改文件不生效,需要 clearCache 或自定义 Control。

Java ResourceBundle 国际化 properties 缓存 真实验证 动画演示
Java 内部原理 2026-10-04

Files.walkFileTree:递归遍历的访问者模型

在 JDK 21 / macOS 上实测 Files.walkFileTree:回调顺序与目录顺序(不是字母序也不是创建序);SKIP_SUBTREE / SKIP_SIBLINGS / TERMINATE 在 pre 与 file 中返回的不同效果;maxDepth 到达上限的目录走 visitFile;递归删除;符号链接与 FileSystemLoopException;权限错误下 visitFileFailed 与 Files.walk 的 UncheckedIOException;4000 个文件的耗时对比。

Java Files.walkFileTree NIO.2 文件遍历 符号链接 真实验证 动画演示
Java 内部原理 2026-10-04

PathMatcher:文件匹配模式的边界

在 JDK 21 / macOS 上实测 PathMatcher:21 个 glob 对 12 个路径的匹配矩阵;**/*.java 不匹配顶层文件、[^A-M] 不是取反、glob 区分大小写即使文件系统不区分;转义与分隔符;非法 pattern 的异常与不报错的 {}、***;newDirectoryStream 的 glob 只看一层,walk + PathMatcher 在相对路径与绝对路径下的结果。

Java PathMatcher glob NIO.2 文件匹配 真实验证 动画演示
Java 内部原理 2026-10-04

SecureDirectoryStream:减少路径竞态

在 JDK 17 / 21 / 27 上实测 SecureDirectoryStream:macOS 上只有 JDK 27 的 Files.newDirectoryStream 返回它;JDK 21 上目录被换成符号链接后,检查再使用、toRealPath、已打开的 DirectoryStream 都会删到 outside;JDK 27 上通过流操作删的是原目录;但 walkFileTree 的访问器按路径操作仍会穿过链接,流方法接受 ../ 与绝对路径。

Java SecureDirectoryStream NIO.2 符号链接 TOCTOU 真实验证 动画演示
Java 内部原理 2026-10-04

FileStore:文件系统容量与属性

在 JDK 21 / macOS 上用真实的磁盘映像验证 FileStore:APFS、HFS+(20 MB)与 FAT32(64 MB)的类型、容量与属性视图;getFileStores 的 15 项与 mount 对应;写满卷时 usable 与 IOException;FAT32 的 2 秒时间戳;稀疏文件 2 GB 占 0 KB、APFS 克隆不占空间;只读挂载的行为。

Java FileStore 磁盘空间 APFS NIO.2 真实验证 动画演示
Java 内部原理 2026-10-04

CertificateFactory:从字节流读取证书链

在 JDK 21 上用 keytool 生成的三级证书链验证 CertificateFactory:PEM 的前置文字、CRLF、标签文字不检查但头尾要一致;缩进的 PEM、截断的 base64、错位的头尾各自的异常;证书链文件的流语义(连续 4 次调用的第 4 次 Empty input);CertPath 的 PkiPath 与 PKCS7 编码(PKCS7 往返顺序变了);PKIX 验证的顺序与信任锚;同一份 PEM 解析出同一个对象。

Java CertificateFactory X.509 证书链 CertPath 真实验证 动画演示
Java 内部原理 2026-10-04

CRL 与 OCSP:证书撤销状态

在 JDK 21 上用 openssl 现场建 CA、签发与吊销证书,并起真实的 CRL HTTP 服务器与 openssl ocsp 响应器:CRL 过期被当作没有(UNDETERMINED);PKIXRevocationChecker 不需要 enableCRLDP,默认 PKIXParameters 需要;OCSP 每次验证发一次请求;响应器停掉时默认回退到 CRL、NO_FALLBACK 报 UNDETERMINED、SOFT_FAIL 会放行已吊销的证书;2 万条的 CRL 为 707986 字节。

Java CRL OCSP 证书吊销 PKIX 真实验证 动画演示
Java 内部原理 2026-10-04

SSLSessionContext:管理 TLS 会话缓存

在 JDK 21 上用本机 SSLServerSocket / SSLSocket(RSA-3072 证书)验证 SSLSessionContext:默认缓存 20480 / 超时 86400 秒;默认的会话票据让服务端不缓存会话,setSessionTimeout 与 setSessionCacheSize 都不起作用;关闭 jdk.tls.*.enableSessionTicketExtension 后才生效,缓存 3 个时 6 个客户端按序重连全部完整握手;TLS 1.3 invalidate 一个会话后用另一张票据恢复。

Java TLS SSLSessionContext 会话恢复 会话票据 真实验证 动画演示
Java 内部原理 2026-10-04

KeyGenerator:生成对称密钥的参数边界

在 JDK 17 / 21 / 27 上验证 KeyGenerator:24 个 SunJCE 服务;AES 默认长度 JDK 17 为 128 位而 JDK 21 / 27 为 256 位;各算法 init(int) 接受的长度与拒绝时的异常(DES 只收 56、HMAC 至少 40 位);随机源由调用者决定,种子固定的 SHA1PRNG 会生成相同的密钥;DES 的奇偶校验位;8 线程共用同一个实例 20 万个密钥无重复。

Java KeyGenerator 对称密钥 AES SecureRandom 真实验证 动画演示
Java 内部原理 2026-10-04

AlgorithmParameters:保存算法参数而非密钥

在 JDK 21 上验证 AlgorithmParameters:34 个服务;GCM 参数编码 19 字节(IV 12 字节 + tag 长度),getEncoded("JSON") 不报错;同一个 Cipher 重用 IV 被拦截,但新建 Cipher 用同一个 IV 不被拦截;CBC 错误的 IV 只破坏第一块;EC 曲线参数的 OID 编码,prime256v1 不被接受;PBE 参数 79 字节含盐、迭代次数与 IV;参数文件与 AAD、篡改的结果。

Java AlgorithmParameters AES-GCM IV PBE EC 真实验证 动画演示
Java 内部原理 2026-10-04

PasswordCallback:认证过程中如何请求密码

在 JDK 21 上用自写 LoginModule 与 JDK 自带 KeyStoreLoginModule 验证 JAAS 如何请求口令:PasswordCallback 保存与返回的都是副本,clearPassword 只清内部副本;它可序列化且字节流含口令;required / requisite / sufficient / optional 下 handler 的调用次数与 commit / abort 的调用;共享状态;handler 异常被包装成 LoginException;KeyStoreLoginModule 依次发出的 5 个回调。

Java JAAS PasswordCallback LoginModule CallbackHandler 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号