【Java高级语法】(二十三)系统辅助工具类:解析System类,一个系统操作与资源管理工具类~

news2024/11/16 8:50:03

Java高级语法详解之系统辅助工具类

  • 1️⃣ 概念
  • 2️⃣ 优势和缺点
  • 3️⃣ 使用
    • 3.1 System类常用方法
    • 3.2 使用技巧
  • 4️⃣ 应用场景
  • 🌾 总结

在这里插入图片描述

1️⃣ 概念

Java的System类是Java标准库中一个重要且常用的类。它被设计用于提供与系统相关的操作和信息访问功能。System类的设计目的是为了让开发者更方便地与底层操作系统进行交互,并提供一些常见而有用的系统级别的功能。

System类是一个包含各种静态方法和字段的系统辅助工具类。它提供了一系列静态方法,用于访问系统属性、执行外部命令、获取系统时间等操作。

System类是Java标准库的一部分,它与底层的操作系统交互通过JNI(Java Native Interface)实现,通过调用本地方法访问底层操作系统的功能。

System类具有以下特征:

  • 类中的方法和字段都是静态的,可以直接通过类名调用;
  • 提供了许多与系统环境和资源交互的方法,如获取和设置系统属性、标准输入输出流的访问、执行外部命令等;
  • 提供了与垃圾回收器、Java虚拟机等底层操作相关的方法。

2️⃣ 优势和缺点

  • 优点
    提供了统一的接口,方便访问与系统相关的信息和行为;提供了跨平台性,使得编写可移植的Java代码成为可能。

  • 缺点
    过度使用System类的静态方法可能导致代码耦合性增强;类中有些方法在不同的平台上可能表现不一致。

3️⃣ 使用

3.1 System类常用方法

下面表格中列出了System类中的方法和字段,并提供了简要描述。
这些方法和字段允许开发者与底层操作系统进行交互,获取系统属性、执行外部命令、管理输入输出等操作:

类别名称描述
方法arraycopy(Object src, int srcPos, Object dest, int destPos, int length)复制数组中的元素到另一个数组
currentTimeMillis()返回当前时间的毫秒数
exit(int status)退出Java虚拟机,可使用指定的状态码作为程序的结束代码
gc()强制运行垃圾回收器
getenv(String name)获取指定环境变量的值
getProperties()获取当前系统属性的集合。 如获取操作系统版本、文件分隔符等
getProperty(String key)根据键名获取系统属性的值
getProperty(String key, String defaultValue)根据键名获取系统属性的值,如果没有找到则返回默认值
load(String filename)加载本地库
loadLibrary(String libname)加载指定名称的本地库
nanoTime()返回当前系统时间的纳秒数
runFinalization()请求运行已被丢弃对象的 finalize() 方法
runFinalizersOnExit(boolean value)在退出程序时运行所有对象的 finalize() 方法
setErr(PrintStream err)重新指定标准错误输出流
setIn(InputStream in)重新指定标准输入流
setOut(PrintStream out)重新指定标准输出流
setProperty(String key, String value)设置指定键的系统属性值
identityHashCode(Object x)返回给定对象的哈希码
字段in标准输入流(InputStream)
out标准输出流(PrintStream)
err标准错误输出流(PrintStream)

🔍关于exit(int status)方法的参数值问题?

在System类的exit(int status)方法中,可以传递不同的整数值作为参数,每个值都有特定的意义。以下是常用的参数值及其含义:

  • 0:一般表示程序正常终止。通常在没有错误或异常情况下,通过该状态码退出程序。
  • 非零值:一般表示程序非正常终止,可能存在某种错误、异常或其他不可预期的情况。具体的非零值可以根据需要进行定义和约定。

注意,除了0以外,非零状态码的具体含义并没有明确规定。在实际应用中,开发者可以根据自身需求自定义和解释这些状态码。通常,非零状态码被用来表示不同的错误类型或异常情况,以便程序的调用方或脚本等能够根据状态码进行后续处理。

尽管非零值可以用于自定义特定意义的状态码,但建议遵循一些常见的惯例和约定,例如使用负数表示特定错误类型,使用正数表示某种成功状态的变体等。

总之,exit(int status)方法的参数可以是任意整数值,但一般而言,0通常表示正常终止,非零值表示非正常终止或错误情况。

下面是一个使用System类的各个方法和字段的Java案例程序:

import java.util.Arrays;

public class SystemExample {
    public static void main(String[] args) {
        // 方法: arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
        int[] sourceArray = {1, 2, 3, 4, 5};
        int[] destinationArray = new int[5];
        System.arraycopy(sourceArray, 0, destinationArray, 0, sourceArray.length);
        System.out.println(Arrays.toString(destinationArray));

        // 方法: currentTimeMillis()
        long currentTime = System.currentTimeMillis();
        System.out.println(currentTime);

        // 方法: gc()
        System.gc();

        // 方法: getenv(String name)
        String javaHome = System.getenv("JAVA_HOME");
        System.out.println("JAVA_HOME=" + javaHome);

        // 方法: getProperties()
        System.out.println("Properties=" + System.getProperties());

        // 方法: getProperty(String key)
        String osVersion = System.getProperty("os.version");
        System.out.println("os.version=" + osVersion);

        // 方法: getProperty(String key, String defaultValue)
        String javaVendor = System.getProperty("java.vendor", "Unknown");
        System.out.println("java.vendor=" + javaVendor);

        // 方法: load(String filename)
//        System.load("mylibrary.dll");

        // 方法: loadLibrary(String libname)
//        System.loadLibrary("mylibrary");

        // 方法: nanoTime()
        long startTime = System.nanoTime();
        // code here...
        long endTime = System.nanoTime();
        long executionTime = endTime - startTime;
        System.out.println("executionTime = " + executionTime);

        // 方法: runFinalization()
        System.runFinalization();

        // 方法: setErr(PrintStream err)
        System.setErr(System.err);

        // 方法: setIn(InputStream in)
        System.setIn(System.in);

        // 方法: setOut(PrintStream out)
        System.setOut(System.out);

        // 方法: setProperty(String key, String value)
        System.setProperty("my.property", "myValue");
        System.out.println("my.property=" +  System.getProperty("my.property"));

        // 方法: identityHashCode(Object x)
        Object myObject = new Object();
        int objectHashCode = System.identityHashCode(myObject);
        System.out.println("objectHashCode = " + objectHashCode);

        // 字段: in
        try {
            int read = System.in.read();
            System.out.println(read);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 字段: out
        System.out.println("Hello, World!");

        // 字段: err
        System.err.println("Error occurred!");

        // 方法: exit(int status)
        System.exit(0);
        System.out.println("JVM已经停止运行,这里的代码执行不到...");
    }
}

程序运行结果如下:

[1, 2, 3, 4, 5]
1687942503061
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_162
Properties={java.runtime.name=Java(TM) SE Runtime Environment, sun.boot.library.path=C:\Program Files\Java\jdk1.8.0_202\jre\bin, java.vm.version=25.202-b08, java.vm.vendor=Oracle Corporation, java.vendor.url=http://java.oracle.com/, path.separator=;, java.vm.name=Java HotSpot(TM) 64-Bit Server VM, file.encoding.pkg=sun.io, user.country=CN, user.script=, sun.java.launcher=SUN_STANDARD, sun.os.patch.level=, java.vm.specification.name=Java Virtual Machine Specification, user.dir=C:\Users\86182\IdeaProjects\untitled15, java.runtime.version=1.8.0_202-b08, java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment, java.endorsed.dirs=C:\Program Files\Java\jdk1.8.0_202\jre\lib\endorsed, os.arch=amd64, java.io.tmpdir=C:\Users\86182\AppData\Local\Temp\, line.separator=
, java.vm.specification.vendor=Oracle Corporation, user.variant=, os.name=Windows 10, sun.jnu.encoding=GBK, java.library.path=C:\Program Files\Java\jdk1.8.0_202\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\MyApp\;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\ProgramData\Oracle\Java\javapath;c:\windows\system32;c:\windows;c:\windows\System32\Wbem;c:\windows\System32\WindowsPowerShell\v1.0\;c:\windows\System32\OpenSSH\;C:\Program Files\Java\jdk1.8.0_162\bin;C:\Program Files\Java\jdk1.8.0_162\jre\bin;D:\MyApp\TortoiseSVN\bin;*:\MyApp\dmdbms\bin;D:\MyApp\mysql-5.6.47-winx64\bin;C:\Program Files\Git\cmd;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\HP\Common\HPDestPlgIn\;D:\MyApp\NetSarang\;D:\MyApp\Python\Python311\Scripts\;D:\MyApp\Python\Python311\;C:\Users\86182\AppData\Local\Microsoft\WindowsApps;C:\Program Files (x86)\HP\Common\HPDestPlgIn\;D:\MyApp\JetBrains\IntelliJ IDEA 2021.2.3\bin;;., java.specification.name=Java Platform API Specification, java.class.version=52.0, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, os.version=10.0, user.home=C:\Users\86182, user.timezone=, java.awt.printerjob=sun.awt.windows.WPrinterJob, file.encoding=UTF-8, java.specification.version=1.8, java.class.path=C:\Program Files\Java\jdk1.8.0_202\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\rt.jar;C:\Users\86182\IdeaProjects\untitled15\out\production\untitled15;D:\MyApp\JetBrains\IntelliJ IDEA 2021.2.3\lib\idea_rt.jar, user.name=86182, java.vm.specification.version=1.8, sun.java.command=com.xiaoshan.SystemExample, java.home=C:\Program Files\Java\jdk1.8.0_202\jre, sun.arch.data.model=64, user.language=zh, java.specification.vendor=Oracle Corporation, awt.toolkit=sun.awt.windows.WToolkit, java.vm.info=mixed mode, java.version=1.8.0_202, java.ext.dirs=C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext, sun.boot.class.path=C:\Program Files\Java\jdk1.8.0_202\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_202\jre\classes, java.vendor=Oracle Corporation, file.separator=\, java.vendor.url.bug=http://bugreport.sun.com/bugreport/, sun.io.unicode.encoding=UnicodeLittle, sun.cpu.endian=little, sun.desktop=windows, sun.cpu.isalist=amd64}
os.version=10.0
java.vendor=Oracle Corporation
executionTime = 300
my.property=myValue
objectHashCode = 460141958

666
10
Hello, World!
Error occurred!

注意当程序运行到第69行int read = System.in.read();时,需要在console控制台输入数据,程序才会再继续往下执行结束。

3.2 使用技巧

System类在使用时存在以下使用技巧以及注意事项:

  • 在使用System类时,应注意避免滥用静态方法,以免导致代码难以维护和测试。推荐将与System类相关的逻辑封装到单独的模块中,以提高代码的可扩展性和可测试性;
  • System类中的方法多用于与底层系统交互,因此需要对每个操作的结果进行适当的检查和异常处理。

4️⃣ 应用场景

System类可以在多种场景下发挥重要作用:

  • 系统属性的获取和配置,如读取和设置环境变量、文件路径、编码等;
  • 外部命令的执行和控制,如调用系统命令行工具完成特定任务;
  • 监控程序和程序性能优化,通过测量程序运行时间和高效的数组复制等操作。

🌾 总结

System类是Java标准库提供的重要工具类,可用于访问与系统相关的操作、信息和资源。它提供了易于使用且跨平台的接口,使得开发者可以更方便地与底层系统进行交互。

合理并正确地使用System类,可以帮助实现更灵活、高效和可移植的Java应用程序。

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

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

相关文章

【算法系列之贪心算法III】leetcode135. 分发糖果

134. 加油站 力扣题目链接 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定…

创建临时文件mkstemp()和tmpfile()

有些程序需要创建一些临时文件,仅供其在运行期间使用,程序终止后即行删除。例如,很多编译器程序会在编译过程中创建临时文件。GNU C语言函数库为此而提供了一系列库函数。(之所以有“一系列”的库函数,部分原因是由于这…

ASD光谱仪.asd格式光谱曲线文件转换为.txt格式的方法

本文介绍基于ViewSpec Pro软件,将ASD地物光谱仪获取到的.asd格式文件,批量转换为通用的.txt文本格式文件的方法。 ASD光谱仪是英国Malvern Panalytical公司研发的系列野外便携式全范围光谱辐射仪和光谱仪,可以获取地物的实时光谱信息。我们用…

Arch Linux 中的 AUR 是什么?您应该使用它吗?

Arch Linux AUR 存储库包含社区驱动的软件,如果您采取一些简单的预防措施,就可以安全使用。即使您不懂 shell 脚本,也可以使用一些指标来判断包是否安全。 AUR 是 Arch Linux 皇冠上的宝石之一,提供了数千个附加软件包。但是这个用户驱动的存储库使用起来安全吗,还是应该避…

你给企业创建百科了吗?5分钟带你看懂创建企业百度百科的实用技巧和注意事项

企业百度百科是一种企业在互联网上展示自身形象和产品的重要途径。通过在百度百科上创建企业页面,可以让更多的人了解企业的历史、文化、产品和服务等信息,提高企业知名度和品牌形象。分媒互动将介绍企业百度百科的创建方法和需要注意的事项。 一、企业百…

搭建IP代理池 - ProxyPool

前言 在爬虫开发中,我们经常会碰到ip封禁,访问限制的问题,今天主要分享个我在开发中用到过比较好用的ip代理池,希望有需要的小伙伴提供到帮助~ 简介 ProxyPool是一个简易高效的代理池,他可以在windows上搭配redis使…

【强化学习】常用算法之一 “SARSA”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

飞控的安全性设计

针对安全性设计,就必须先考虑故障情况。一般来讲,飞控故障有以下几个方面: 1、通讯故障 飞行器与地面端(遥控器或地面站等设备)需要进行实时通信,如果通信发生故障,后果很严重,因此…

赛效:WPS文字(Word)中的页面背景如何删除

1:打开一个有背景颜色的文档。 2:在“页面布局”选项卡里点击“背景”,在下拉菜单里点击“删除页面背景”。 3:接下来我们看到,文档背景已经恢复了默认的颜色。 如果你想了解更多办公软件以及办公技巧,可以…

青大数据结构【2019】【五算法设计】

关键字: 简单选择排序、二叉树后序遍历 1) void Countsort(int A[],int B[],int n) {int i,j,count;for(i=0;i<n;i++){count=0;for(j=0;j<n;j++)if(A[j]<A[i])count++;B[count]=A[i];}} 2) 每个元素都要与n个元素(含自身)进行比较,故比较次数为n方 3) …

Redis之数据类型String、List、Hash、Set、Sorted Set(详细)

一、String数据类型 1、SET/GET/APPEND/STRLEN &#xff08;1&#xff09; APPEND &#xff08;2&#xff09; SET/STRLEN 2、 INCR/ DECR/INCRBY/DECRBY &#xff08;1&#xff09;INCR/ DECR &#xff08;2&#xff09; INCRBY/DECRBY INCRBY key increment&#xff1…

JavaWed第二章:HTML和CSS的知识制作静态网页

目录 前言 一.HTML和CSS的介绍 &#x1f496;HTML的基本框架 二.HTML常用标签大全 三.资源路径讲解 &#x1f496;路径 &#x1f496;图片 img标签讲解 &#x1f496;超链接标签讲解 四.CSS &#x1f496;CSS的引入方式 五.HTML页面布局 &#x1f496;盒子模型介绍 …

小米手机文件误删还有救,这10个工具请收好!

说到智能手机&#xff0c;小米以其令人印象深刻的功能和实惠的价格成为一个受欢迎的品牌。然而&#xff0c;与任何其他智能手机一样&#xff0c;小米设备上可能会由于各种原因而发生数据丢失。幸运的是&#xff0c;有多种恢复软件可以帮助您从小米设备中检索丢失或删除的数据。…

vue2 配置less

在vue2中配置less&#xff0c;需要安装less和less-loader npm install less less-loader5 --save-dev 直接安装less-loader会报错&#xff0c;提示如下&#xff1a; 安装less 3.0.0版本 npm install less3.3.0 然后在安装less-loader就ok啦。 在vue中使用&#xff0c;设置…

三维空间离散点如何拟合平面?

文章目录 0.引言1.算法原理2.算法实现 0.引言 在点云建模过程中&#xff0c;有时需要对扫描建模的点云进行标定&#xff0c;在实际使用中往往以地面做为参照平面&#xff0c;需要将扫描的三维空间点云进行拟合平面&#xff0c;以便纠正扫描结果。本文对三维空间离散点拟合平面算…

学习Vue3——watch(侦听器)

基本用法 watch有三个参数 第一个参数是监听源 第二个参数回调函数cb&#xff08;newVal,oldVal&#xff09; 第三个参数一个options配置项 监听单个属性 <template><div>姓:<input v-model"lastName" type"text" /></div><…

PostgreSQL 自增主键冲突问题分析及解决办法

创建一个test表 create table test (id integer default nextval(test_id_seq::regclass) not nullconstraint test_pkprimary key,c1 integer );插入数据 insert into test (c1) values (1); insert into test (c1) values (2); insert into test (c1) values (3);发现自增I…

自定义指令实现按钮加密

1. 需求描述 给按钮加一个密码保护&#xff0c;输入的密码正确之后才能进行下一步操作。 2. 实现思路 1. 直接在点击事件里面处理密码校验&#xff0c; <!-- template --> <el-button type"warning" click"handlePub">发布</el-button&…

Unity Android打包成Apk之后 紫屏 无内容

打包成Apk之后 打开游戏 过完logo是紫色的屏幕什么都没有 解决方法&#xff1a; 打开项目的目录&#xff1a; 删除除了 .vscode assets package 之外的所有文件夹 然后重新打开就可以了

【owt】发送侧接收并处理rtcp包 调用堆栈

发送测接收rtcp包并处理大神分析的RTCPReceiver处理的rtcp包 WebRTC源码之RTCPReceiver源码分析 可以看到xr是207MediaStream::read 中 通过 fb_sink_->deliverFeedback(std::move(packet)); 分发rtcp fbsink是 VideoFramePacketizer int VideoFramePacketizer::deliverFee…