Linux vs macOS 文件加载顺序差异

本文通过实际代码示例,简单对比 Linux 和 macOS 两个操作系统在读取目录文件时的行为差异。

最后修改于:

背景

昨天将一个 Java 服务部署到云服务器后,发现本地可用的一个鉴权拦截器(JwtInterceptor)在云端失效了,排查怀疑是本地和远程文件加载顺序不同导致。这里做简单实验进行验证。

测试方案

  • 创建两个特定的 .class 文件(JwtInterceptorConfig.class, WebMvcConfig.class)
  • 使用 os.listdir() 和 Path.iterdir() 两种方法
  • 每种方法都测试5次,以观察顺序是否稳定
  • 分别在 macOS 和 Linux 平台(CentOS)运行

测试代码

由于不论系统、语言,目录读取都是基于 POSIX 标准的 readdir() 系统调用,因此简单起见,这里使用 Python 语音。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import os
from pathlib import Path
import time

def create_test_files():
    # 创建测试目录
    test_dir = Path("config_test")
    if test_dir.exists():
        for file in test_dir.iterdir():
            file.unlink()
    else:
        test_dir.mkdir()
    
    # 创建两个测试文件
    files = ["JwtInterceptorConfig.class", "WebMvcConfig.class"]
    for file in files:
        (test_dir / file).touch()
        time.sleep(0.1)  # 稍微等待一下,确保时间戳不同
    
    return test_dir

def test_directory_reading(directory):
    print(f"\n当前操作系统: {os.name}")
    
    print("\n=== os.listdir() 测试 ===")
    for i in range(5):  # 连续测试5次
        files = os.listdir(directory)
        print(f"第 {i+1} 次:", files)
    
    print("\n=== Path.iterdir() 测试 ===")
    for i in range(5):  # 连续测试5次
        files = [f.name for f in Path(directory).iterdir()]
        print(f"第 {i+1} 次:", files)

def main():
    test_dir = create_test_files()
    test_directory_reading(test_dir)
    
    # 清理测试文件
    input("\n按回车键删除测试文件...")
    for file in test_dir.iterdir():
        file.unlink()
    test_dir.rmdir()

if __name__ == "__main__":
    main()

测试结果

macOS

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
当前操作系统: posix

=== os.listdir() 测试 ===
1 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
2 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
3 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
4 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
5 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']

=== Path.iterdir() 测试 ===
1 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
2 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
3 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
4 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
5 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']

Linux

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
当前操作系统: posix

=== os.listdir() 测试 ===
1 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
2 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
3 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
4 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
5 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']

=== Path.iterdir() 测试 ===
1 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
2 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
3 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
4 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
5 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
本文总阅读量 次 本文总访客量 人 本站总访问量 次 本站总访客数
发表了20篇文章 · 总计32.36k字
本博客已稳定运行
使用 Hugo 构建
主题 StackJimmy 设计