JDK 17 中 java.lang.System 常用方法及应用场景

发布于:2025-06-25 ⋅ 阅读:(15) ⋅ 点赞:(0)

概述

java.lang.System 在 JDK 17 中依然是最核心的系统交互类之一。以下是针对 JDK 17 的常用方法详解,包含新特性和最佳实践。

一、标准 I/O 流(更新至 JDK 17)

1. 控制台输出

// 传统输出方式(仍然可用)
System.out.println("Hello JDK 17");

// 新增:使用文本块(Text Blocks,JDK 15 正式特性)
System.out.println("""
    This is a multi-line
    text block in JDK 17.
    No more messy concatenation!
    """);

应用场景:日志输出、多行文本处理

2. 错误输出(新增格式化方法)

// JDK 17 增强的格式化错误输出
System.err.printf("Error at %s: %d%n", Instant.now(), errorCode);

// 使用新的格式说明符
System.err.printf("Hex value: %#x %n", 255);  // 输出: Hex value: 0xff

二、系统属性操作(JDK 17 安全增强)

1. 获取系统属性(新增过滤检查)

// 传统方式
String javaHome = System.getProperty("java.home");

// JDK 17 更安全的属性读取(避免NPE)
String nonExistent = System.getProperty("non.existent.prop", "default-value");

// 获取模块化相关信息(JDK 9+)
System.out.println("Module path: " + System.getProperty("jdk.module.path"));

2. 只读系统属性视图(JDK 17)

// 获取不可修改的系统属性视图
Map<String,String> props = System.getProperties();
try {
    props.put("new.key", "value");  // 抛出 UnsupportedOperationException
} catch (UnsupportedOperationException e) {
    System.err.println("系统属性是只读的!");
}

三、时间测量(JDK 17 新增时间API整合)

1. 高精度时间测量

// 传统方式
long start = System.nanoTime();
// ...操作...
long duration = System.nanoTime() - start;

// JDK 17 推荐结合 java.time
Instant startInstant = Instant.now();
// ...操作...
Duration elapsed = Duration.between(startInstant, Instant.now());
System.out.printf("耗时: %d ms %n", elapsed.toMillis());

四、数组操作(JDK 17 优化)

1. 数组复制(新增安全检查)

// 传统数组复制
int[] src = IntStream.range(1, 6).toArray();
int[] dest = new int[5];
System.arraycopy(src, 0, dest, 0, 5);

// JDK 17 更安全的替代方案(推荐)
int[] copy = Arrays.copyOf(src, src.length);

五、环境变量访问(JDK 17 安全改进)

1. 读取环境变量

// 传统方式
String path = System.getenv("PATH");

// JDK 17 更安全的访问方式
Optional<String> javaHome = Optional.ofNullable(System.getenv("JAVA_HOME"));
javaHome.ifPresentOrElse(
    home -> System.out.println("Java Home: " + home),
    () -> System.err.println("JAVA_HOME 未设置")
);

六、新增实用方法(JDK 11+)

1. System.console() 增强

// JDK 17 更健壮的控制台交互
Console console = System.console();
if (console != null) {
    String input = console.readLine("请输入密码: ");
    char[] password = console.readPassword();
    Arrays.fill(password, ' ');  // 安全清除
} else {
    System.err.println("无控制台环境");
}

2. System.Logger (JDK 9+)

// 系统统一日志接口
System.Logger logger = System.getLogger("MyApp");
logger.log(System.Logger.Level.INFO, "JDK 17 系统日志");

// 输出示例:
// 六月 24, 2023 10:00:00 上午 MyApp INFO: JDK 17 系统日志

七、进程处理(JDK 17 新增)

1. 进程句柄 API

// 获取当前进程信息(JDK 9+)
ProcessHandle current = ProcessHandle.current();
System.out.println("PID: " + current.pid());
System.out.println("CPU 使用: " + current.info().cpuDuration());

// 列出所有进程(JDK 17 增强)
ProcessHandle.allProcesses()
    .filter(p -> p.info().command().isPresent())
    .limit(5)
    .forEach(p -> System.out.println(p.info().command().get()));

八、内存管理(JDK 17 改进)

1. 内存状态查询

// JDK 17 更精确的内存报告
Runtime runtime = Runtime.getRuntime();
System.out.printf("""
    内存使用情况:
    总内存: %d MB
    可用内存: %d MB
    最大内存: %d MB
    """,
    runtime.totalMemory() / (1024 * 1024),
    runtime.freeMemory() / (1024 * 1024),
    runtime.maxMemory() / (1024 * 1024)
);

最佳实践建议(JDK 17)

1、替代弃用方法

  1. 使用 Instant.now() 替代 System.currentTimeMillis()

  2. 使用 Arrays.copyOf() 替代 System.arraycopy() 简单场景

2、安全增强

// 不推荐(可能暴露敏感信息)
System.getProperties().list(System.out);

// 推荐方式(JDK 17)
Set<String> sensitiveKeys = Set.of("user.name", "user.home");
System.getProperties().entrySet().stream()
    .filter(e -> !sensitiveKeys.contains(e.getKey()))
    .forEach(e -> System.out.println(e.getKey() + "=" + e.getValue()));

3、模块化兼容

// 检查模块系统
if (System.getProperty("jdk.module.main") != null) {
    System.out.println("运行在模块模式下");
}

完整示例:JDK 17 系统信息工具

public class SystemInfoTool {
    public static void main(String[] args) {
        printSystemInfo();
        checkJavaVersion();
    }

    private static void printSystemInfo() {
        String osInfo = """
            OS 信息:
            名称: %s
            版本: %s
            架构: %s
            """.formatted(
                System.getProperty("os.name"),
                System.getProperty("os.version"),
                System.getProperty("os.arch")
            );
        
        System.out.println(osInfo);
    }

    private static void checkJavaVersion() {
        Runtime.Version version = Runtime.version();
        System.out.printf("""
            Java 版本信息:
            Feature: %d
            Interim: %d
            Update: %d
            Patch: %d
            LTS: %b
            """,
            version.feature(),
            version.interim(),
            version.update(),
            version.patch(),
            version.feature() == 17  // JDK 17 是 LTS
        );
    }
}

输出示例:

OS 信息:
名称: Windows 10
版本: 10.0
架构: amd64

Java 版本信息:
Feature: 17
Interim: 0
Update: 5
Patch: 0
LTS: true


网站公告

今日签到

点亮在社区的每一天
去签到