二十八、API之《System 类》——与框架交互的“桥梁”

news/2025/10/2 9:15:50/文章来源:https://www.cnblogs.com/ljbguanli/p/19123201

二十八、API之《System 类》——与框架交互的“桥梁”

在 Java 开发中,System 类是一个特殊且核心的存在。
它不像普通类那样需要创建实例,而是直接通过静态成员与系统资源交互,提供了获取系统信息、控制程序生命周期、操作标准流等关键能力。
无论是日常开发中的控制台输出,还是性能优化时的执行时间统计,System 类都扮演着不可或缺的角色。本文将从核心字段、常用方法、实际场景三个维度,带你彻底掌握 System 类的用法。

一、先搞懂:System 类的“特殊身份”

在学习具体功能前,先明确 System 类的设计逻辑:

  • 无需实例化System 类的构造方法被声明为 private,禁止外部创建对象,所有功能都通过静态字段静态方法提供,直接用 System.xxx 调用即可。
  • 与系统强绑定:它封装了 JVM 与操作系统交互的底层逻辑,比如获取系统时间、操作标准输入输出流、控制虚拟机退出等,是 Java 程序与系统资源沟通的“直接通道”。

二、核心字段:3个常用的“系统流”

System 类提供了三个静态字段,分别对应系统的标准输入、输出和错误输出流,是日常开发中“输入输出”的基础。

字段名类型作用说明默认关联设备
System.inInputStream标准输入流:用于从外部读取数据(比如接收用户输入),是字节流的源头。键盘
System.outPrintStream标准输出流:用于向外部打印“正常信息”(比如日志、结果展示),支持字符输出。控制台
System.errPrintStream标准错误输出流:专门打印“错误信息”(比如异常堆栈、程序报错),优先级更高。控制台

关键区别:System.out 与 System.err

很多初学者会混淆这两个输出流,它们虽然默认都打印到控制台,但在用途行为上有本质区别:

  1. 用途不同(语义区分):

    • System.out:打印“正常业务信息”,比如程序运行结果、调试日志(如 System.out.println("计算完成"))。
    • System.err:仅打印“错误信息”,比如捕获异常时输出堆栈(如 e.printStackTrace() 本质就是通过 System.err 输出)。
  2. 输出优先级不同

    • System.out 可能有缓冲(需积累一定数据才输出),而 System.err 通常无缓冲,错误信息会“立即输出”。
    • 示例:当两者同时打印时,错误信息可能比正常信息更早显示(即使代码中 System.out 写在前面):
      public class SystemStreamDemo {
      public static void main(String[] args) {
      System.out.println("这是正常输出"); // 可能后显示
      System.err.println("这是错误输出"); // 可能先显示
      }
      }
  3. 实际应用场景

    • 开发时,用 System.out 做临时调试;上线后,错误信息需通过 System.err 定向到日志文件(便于排查问题),而正常信息可单独处理。

三、常用方法:4个高频场景实战

System 类的方法不多,但每一个都很实用,以下是开发中最常用的4个方法,结合场景讲解用法。

1. currentTimeMillis():获取系统时间(毫秒级)

方法定义
public static long currentTimeMillis()

返回从1970年1月1日 00:00:00 UTC(称为“历元时间”或“时间戳起点”)到当前时刻的毫秒数(1秒 = 1000毫秒),返回值类型为 long(避免时间溢出)。

3个核心应用场景
场景1:统计代码执行耗时

这是最常用的场景!通过“执行前记录时间 → 执行后记录时间 → 计算差值”,即可得到代码块的运行时间,用于性能分析。

示例:统计“计算1到100万的和”所需时间

public class TimeDemo {
public static void main(String[] args) {
// 1. 记录代码执行前的时间
long startTime = System.currentTimeMillis();
// 2. 执行要测试的代码
int sum = 0;
for (int i = 1; i <= 1_000_000; i++) {
sum += i;
}
// 3. 记录代码执行后的时间
long endTime = System.currentTimeMillis();
// 4. 计算耗时(毫秒)
System.out.println("1到100万的和:" + sum);
System.out.println("代码执行耗时:" + (endTime - startTime) + " ms");
}
}

注意:如果代码执行时间极短(比如微秒级),可改用 System.nanoTime()(返回纳秒级时间,1毫秒 = 1000000纳秒),精度更高。

场景2:生成“唯一临时标识”

利用时间戳的唯一性,可生成简单的临时ID(如订单号前缀、临时文件名),避免重复。

示例:生成临时文件名

String tempFileName = "temp_" + System.currentTimeMillis() + ".txt";
System.out.println("临时文件名:" + tempFileName);
// 输出示例:temp_1696000000000.txt
场景3:转换为“可读时间”

currentTimeMillis() 返回的是毫秒数,可通过 SimpleDateFormat 或 Java 8+ 的 LocalDateTime 转换为“年-月-日 时:分:秒”格式。

示例(Java 8+ 写法):

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
public class TimeConvertDemo {
public static void main(String[] args) {
// 1. 获取当前时间戳(毫秒)
long timeMillis = System.currentTimeMillis();
// 2. 转换为LocalDateTime(需指定时区,避免时区偏差)
LocalDateTime dateTime = LocalDateTime.ofInstant(
Instant.ofEpochMilli(timeMillis),
ZoneId.systemDefault() // 系统默认时区(如Asia/Shanghai)
);
// 3. 格式化输出
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String readableTime = dateTime.format(formatter);
System.out.println("当前时间:" + readableTime);
// 输出示例:2024-05-20 14:30:00
}
}

2. exit(int status):强制退出虚拟机

方法定义
public static void exit(int status)
  • 作用:立即终止 Java 虚拟机(JVM),程序后续代码不再执行。
  • 参数 status:退出状态码,0 表示“正常终止”,非 0 表示“异常终止”(具体值可自定义,用于告知调用者程序退出原因)。
应用场景:程序需要“主动终止”的场景

比如用户输入“退出”指令时,或检测到致命错误(如配置文件缺失)时,主动终止程序。

示例:检测到错误时退出程序

public class ExitDemo {
public static void main(String[] args) {
// 模拟检测配置文件
boolean configExists = checkConfig();
if (!configExists) {
System.err.println("错误:配置文件缺失,程序无法运行!");
System.exit(1); // 非0状态码,标识异常终止
}
// 如果上面执行了exit,下面代码不会执行
System.out.println("程序正常启动...");
}
// 模拟检查配置文件
private static boolean checkConfig() {
return false; // 模拟配置文件不存在
}
}

注意:exit() 是“强制退出”,会跳过 finally 块(如果 finally 中没有 exit() 本身),使用时需确保资源已释放(如关闭文件流、数据库连接)。

3. gc():建议执行垃圾回收

方法定义
public static void gc()
  • 作用:向 JVM 发送“垃圾回收建议”,告知 JVM“当前可以回收无用对象的内存”。
  • 关键注意点gc() 是“建议”而非“强制”——JVM 会根据自身的内存管理策略(如内存使用率、GC 算法)决定是否立即执行垃圾回收,开发者无法精确控制。
应用场景:内存敏感场景的“辅助回收”

比如程序执行完一个内存消耗极大的任务(如处理大量临时对象)后,可调用 gc() 建议回收内存,避免后续操作内存不足。

示例:处理大量临时对象后建议GC

public class GCDemo {
public static void main(String[] args) {
// 模拟创建大量临时对象(消耗内存)
for (int i = 0; i < 10_000; i++) {
new Object(); // 临时对象,使用后无引用,成为“垃圾”
}
// 任务完成后,建议JVM回收垃圾
System.gc();
System.out.println("已建议JVM执行垃圾回收");
}
}

误区提醒:不要依赖 gc() 解决内存泄漏问题!如果对象存在无效引用(如静态集合未清空),即使调用 gc(),这些对象也无法被回收。gc() 仅能回收“无引用的对象”。

4. arraycopy():高效复制数组

方法定义
public static void arraycopy(
Object src,      // 源数组(要复制的数组)
int srcPos,      // 源数组的起始复制位置
Object dest,     // 目标数组(复制到的数组)
int destPos,     // 目标数组的起始存放位置
int length       // 要复制的元素个数
)
  • 作用:从源数组的指定位置,复制指定长度的元素到目标数组的指定位置,是 Java 中复制数组的“底层高效方法”(比 for 循环手动复制快,因为是 native 方法,直接调用操作系统底层)。
应用场景:数组扩容、元素迁移

比如 ArrayList 的扩容逻辑,底层就是通过 System.arraycopy() 实现旧数组到新数组的复制。

示例:复制数组的部分元素

public class ArrayCopyDemo {
public static void main(String[] args) {
// 源数组:[1, 2, 3, 4, 5]
int[] srcArray = {1, 2, 3, 4, 5};
// 目标数组:长度为3的空数组
int[] destArray = new int[3];
// 复制源数组的第2个元素(索引1)开始的3个元素,到目标数组的第0个位置
System.arraycopy(srcArray, 1, destArray, 0, 3);
// 打印目标数组
for (int num : destArray) {
System.out.print(num + " "); // 输出:2 3 4
}
}
}

四、扩展:其他实用方法

除了上述高频方法,System 类还有两个常用的“系统信息相关方法”:

方法名作用说明
System.getProperties()获取当前系统的所有属性(如操作系统名称、Java版本、用户目录等),返回 Properties 对象。
System.getProperty(String key)根据指定的“属性键”,获取对应的系统属性值(如 System.getProperty("os.name") 获取操作系统名称)。

示例:获取系统关键信息

public class SystemInfoDemo {
public static void main(String[] args) {
// 获取操作系统名称
String osName = System.getProperty("os.name");
// 获取Java版本
String javaVersion = System.getProperty("java.version");
// 获取用户的主目录
String userHome = System.getProperty("user.home");
System.out.println("操作系统:" + osName);      // 输出:Windows 10 或 macOS...
System.out.println("Java版本:" + javaVersion); // 输出:1.8.0_301 或 17.0.1...
System.out.println("用户主目录:" + userHome);  // 输出:C:\Users\XXX 或 /Users/XXX...
}
}

五、总结:System 类的核心价值

System 类虽然简单,但却是 Java 程序与系统交互的“基石”,其核心价值在于:

  1. 简化系统交互:无需关注底层实现,直接通过静态成员操作标准流、获取系统时间、控制虚拟机。
  2. 提升开发效率:提供 arraycopy() 等高效方法,避免重复造轮子。
  3. 辅助调试与优化:通过 currentTimeMillis() 统计性能,通过 gc() 辅助内存管理。

掌握 System 类的用法,能让你在日常开发中更高效地处理输入输出、时间统计、程序控制等场景,是每个 Java 开发者的必备基础。

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

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

相关文章

2025橡胶木板材厂家TOP企业品牌推荐排行榜,泰国橡胶木板材,橡胶木免漆板,橡胶木 PET,橡胶木门板,AA 橡胶木,橡胶木指接板公司推荐!

在当下的家居建材市场中,橡胶木板材凭借其出色的性价比、良好的物理性能以及丰富的应用场景,备受消费者与行业从业者的青睐。然而,随着市场的蓬勃发展,各类橡胶木板材品牌如雨后春笋般涌现,质量参差不齐,这给消费…

网站建设哪家公司便宜wordpress游客投稿

类 类的基本特性 数据抽象和封装继承多态 1 类的构成——抽象 概念 数据抽象是一种依赖于接口和实现的分离的编程技术。类的接口包括用户所能执行的操作&#xff1b;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需要的的各种私有函数。封装实现了类的接口和实…

2025润滑油供应商最新权威推荐排行榜:聚焦耐磨润滑油、工业润滑油、鑫美工业润滑油、壳牌润滑油、道达尔润滑油助力企业采购决策

当前工业领域对润滑油的需求持续增长,但市场乱象却让企业采购面临诸多难题。部分供应商缺乏合规供货渠道,产品无原厂认证与溯源体系,假冒伪劣产品导致设备故障频发、运维成本激增;还有供应商供应链响应慢,紧急用油…

网站手机版二维码怎么做腾讯域名怎么做网站

编码是信息从一种形式或格式转换为另一种形式的过程&#xff0c;也称为计算机编程语言的代码简称编码。 用预先规定的方法将文字、数字或其它对象编成数码&#xff0c;或将信息、数据转换成规定的电脉冲信号。 编码在电子计算机、电视、遥控和通讯等方面广泛使用。 解码&#x…

多状态循环泵控件开发

所遇问题 描述:在使用定时器设置泵的运行状态时 ,可以成功运行 ,但是会一卡一卡的这里猜测的是定时器时间设置过短导致它本身一个周期还未运行完成就重新开启下一轮的运行 但是将时间设置大了之后 ,结果并不是这样…

2025活塞杆厂家TOP企业品牌推荐排行榜,精密,不锈钢,调制,超长,油缸,气缸,镀铬,大直径,精细活塞杆推荐这十家公司!

在当前工业自动化快速发展的背景下,活塞杆作为液压油缸、气缸等关键执行部件的核心连接部件,其质量与性能直接影响着众多行业设备的运行精度和使用寿命。然而,当下活塞杆市场呈现出较为复杂的局面,不同制造商的产品…

藁城外贸网站建设投稿 wordpress

官网&#xff1a;https://spring.io/projects/spring-cloud 官方说法&#xff1a;Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话…

实用指南:WSL2搭建Hadoop伪分布式环境

实用指南:WSL2搭建Hadoop伪分布式环境pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

3整数规划-分支定界法

分支定界法(Branch and Bound Method 一、分支定界法概述 1. 定义与定位 分支定界法是求解 整数规划问题(纯整数、混合整数、0-1规划)的 核心全局优化算法,由 Land 和 Doig 于1960年提出。 其核心思想是通过“分支…

西安网站建设服务网站备案个人使用

Android Deobfuscation11/11/2019本文内容ProGuard、DexGuard 和 R8 是用于对 Android 应用程序的代码进行优化和模糊处理的工具。 它会删除未使用的代码、重命名具有语义模糊名称的类、字段和方法&#xff0c;使基本代码更小&#xff0c;更难反向工程。 若要在 Android 应用中…

完整教程:Ubuntu 系统安装 Prometheus+Grafana(附shell脚本一键部署↓)

完整教程:Ubuntu 系统安装 Prometheus+Grafana(附shell脚本一键部署↓)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family…

网站的设计与制作论文题目成都高端网站建设哪家好

这世界上有后悔药– www.houhuiyao.cc 后悔药数据恢复 站长语前面的内容也提到过update或delete误更新删除了数据后如何恢复。实际生产环境中常常因各种不同场景导致一些办法有效一些办法无效&#xff0c;当然&#xff0c;最有效的办法依然是备份&#xff01;虽然啰嗦&#xff…

重庆市住房和城乡建设部网站自己怎么开发app软件

文章目录 性能比较区别使用方式和行为 性能比较 最终总结&#xff1a;如果数据在1万以内的话&#xff0c;for循环效率高于foreach和stream&#xff1b;如果数据量在10万的时候&#xff0c;stream效率最高&#xff0c;其次是foreach,最后是for。另外需要注意的是如果数据达到10…

详细介绍:【计算机视觉】形态学的去噪

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

阿里巴巴做网站的电话号码wordpress社

JavaScript返回上一页代码区别&#xff1a; window.history.go(-1); //返回上一页window.history.back(); //返回上一页//如果要强行刷新的话就是&#xff1a;window.history.back();location.reload();window.location.go(-1); //刷新上一页

开封旅游网站建设网页推广莱西市城乡建设局网站

最近&#xff0c;Oracle采用了一种新策略&#xff0c;即每六个月发布一次新的语言版本。 该策略假定只有每个第3版都将提供长期支持或LTS。 快速说明&#xff1a; 具有LTS的当前版本是Java 8&#xff1b; Java 9仅应在2018年3月之前获得支持&#xff0c;因此已经结束。 Java…

[apple pencil二代充不上电]

不废话: 先不急着联系苹果官方ipad 插上电 2.apple pencil 2 吸附在旁边 3.等一夜 4.早上起来反复开关ipad蓝牙, 5.连上了

分布式光纤声波振动与AI的深度融合:开启智慧感知新时代 - 指南

分布式光纤声波振动与AI的深度融合:开启智慧感知新时代 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Co…

2025液压扳手实力厂家推荐榜:精准扭矩与耐用品质专业之选

2025液压扳手实力厂家推荐榜:精准扭矩与耐用品质专业之选在工业装备领域,液压扳手作为关键扭矩工具,其性能直接影响设备安装质量与运维安全。随着2025年工业技术标准的提升,市场对液压扳手的精度、耐用性及适配性提…

网站建设如何选择良好的服务器长沙网页制作网站

如何开展软件架构之概念架构 到目前为止&#xff0c;我们已经完成了需求的分析过程&#xff0c;总结来说&#xff0c;主要的步聚是 一&#xff09;需求结构化&#xff0c; 二&#xff09;分析约束影响 三&#xff09;重点关注质量需求。 那么接下来的阶段则是系统的概念架构了&…