java-System 概述 1

## Java中的System类

### 1. System类的基本概念

`System`类是Java标准库中的一个核心类,位于`java.lang`包中。`System`类包含了一些非常重要的类字段和方法,用于访问系统资源和进行系统级操作。常见的功能包括标准输入输出流的访问、系统属性的获取和设置、系统时间的获取等。

`System`类是一个`final`类,不能被继承。它的构造方法是私有的,不能直接实例化。这些设计确保了`System`类的功能的安全性和一致性。

### 2. System类的字段和方法

#### 2.1 常用字段

`System`类中有几个重要的类字段,这些字段用于标准输入输出流的管理:

- `public static final InputStream in`:标准输入流,通常与键盘输入相关联。
- `public static final PrintStream out`:标准输出流,通常与控制台输出相关联。
- `public static final PrintStream err`:标准错误输出流,通常与控制台错误输出相关联。

这些字段的默认值通常在Java虚拟机启动时设置,用户可以通过`System.setIn`、`System.setOut`和`System.setErr`方法重定向这些流。

#### 2.2 常用方法

`System`类提供了许多静态方法,用于执行系统级操作。以下是一些常用的方法:

- `public static void setIn(InputStream in)`:重定向标准输入流。
- `public static void setOut(PrintStream out)`:重定向标准输出流。
- `public static void setErr(PrintStream err)`:重定向标准错误输出流。
- `public static long currentTimeMillis()`:返回当前时间(以毫秒为单位)。
- `public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)`:数组拷贝。
- `public static Properties getProperties()`:获取当前系统属性。
- `public static String getProperty(String key)`:获取指定键的系统属性。
- `public static String getProperty(String key, String def)`:获取指定键的系统属性,如果属性不存在,返回默认值。
- `public static void setProperty(String key, String value)`:设置系统属性。
- `public static String getenv(String name)`:获取指定环境变量的值。
- `public static Map<String, String> getenv()`:获取所有环境变量。

### 3. System类的底层实现

`System`类的底层实现依赖于Java虚拟机和本地操作系统。许多方法通过Java本地接口(JNI)调用本地操作系统的API实现其功能。

#### 3.1 标准输入输出流的初始化

`System`类的标准输入输出流在类加载时进行初始化。这些流与底层操作系统的输入输出流相关联。以下是一些关键的实现细节:

```java
public final class System {
    public static final InputStream in = null;
    public static final PrintStream out = null;
    public static final PrintStream err = null;

    static {
        // 初始化标准输入输出流
        setIn0(new BufferedInputStream(new FileInputStream(FileDescriptor.in)));
        setOut0(new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.out)), true));
        setErr0(new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.err)), true));
    }

    private static native void setIn0(InputStream in);
    private static native void setOut0(PrintStream out);
    private static native void setErr0(PrintStream err);
}
```

在上述代码中,`System`类通过静态代码块初始化标准输入输出流。这些流与`FileDescriptor`对象相关联,后者表示与本地操作系统的标准输入输出文件描述符。

#### 3.2 系统时间

`currentTimeMillis`方法通过本地方法获取系统时间:

```java
public static native long currentTimeMillis();
```

这个方法调用底层操作系统的API获取当前时间,并返回以毫秒为单位的时间戳。在Windows系统上,它可能调用`GetSystemTimeAsFileTime`函数;在Unix系统上,它可能调用`gettimeofday`或`clock_gettime`函数。

#### 3.3 数组拷贝

`arraycopy`方法用于高效地复制数组,避免了Java层面的循环操作。它的底层实现也是通过本地方法:

```java
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
```

`arraycopy`方法在不同的Java虚拟机实现中可能调用不同的本地方法。在Oracle的HotSpot虚拟机中,它调用`JVM_ArrayCopy`函数,该函数直接操作内存以提高性能。

#### 3.4 系统属性

`getProperties`和`getProperty`方法用于获取系统属性。这些方法通过Java本地接口(JNI)调用本地方法获取属性值:

```java
public static Properties getProperties() {
    if (props == null) {
        initProperties();
    }
    return props;
}

private static native Properties initProperties();
```

`initProperties`方法调用本地方法初始化系统属性,例如操作系统名称、版本、用户信息、文件路径分隔符等。这些属性通过`Properties`对象存储,可以通过键值对的形式进行访问。

### 4. System类的使用示例

#### 4.1 重定向标准输入输出流

可以使用`System.setIn`、`System.setOut`和`System.setErr`方法重定向标准输入输出流。例如,将标准输出重定向到文件:

```java
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        PrintStream fileOut = new PrintStream(new FileOutputStream("output.txt"));
        System.setOut(fileOut);
        
        System.out.println("This will be written to the file.");
    }
}
```

在上述代码中,标准输出流被重定向到`output.txt`文件,所有通过`System.out.println`输出的内容将写入该文件。

#### 4.2 获取和设置系统属性

可以使用`System.getProperty`和`System.setProperty`方法获取和设置系统属性。例如:

```java
public class Main {
    public static void main(String[] args) {
        String javaVersion = System.getProperty("java.version");
        System.out.println("Java Version: " + javaVersion);

        System.setProperty("my.custom.property", "customValue");
        String customProperty = System.getProperty("my.custom.property");
        System.out.println("Custom Property: " + customProperty);
    }
}
```

在上述代码中,获取了Java版本信息,并设置了一个自定义的系统属性。

#### 4.3 数组拷贝

可以使用`System.arraycopy`方法高效地复制数组。例如:

```java
public class Main {
    public static void main(String[] args) {
        int[] src = {1, 2, 3, 4, 5};
        int[] dest = new int[5];
        
        System.arraycopy(src, 0, dest, 0, src.length);
        
        for (int i : dest) {
            System.out.print(i + " ");
        }
    }
}
```

在上述代码中,通过`System.arraycopy`方法将`src`数组的内容复制到`dest`数组。

### 5. System类的扩展功能

`System`类不仅提供了基本的系统操作功能,还包含了一些高级功能和优化设计。例如,垃圾回收的触发、加载本地库、终止Java虚拟机等。

#### 5.1 垃圾回收

可以使用`System.gc()`方法建议Java虚拟机进行垃圾回收。尽管调用`gc`方法并不能保证垃圾回收会立即发生,但它向虚拟机发出了执行垃圾回收的建议:

```java
public class Main {
    public static void main(String[] args) {
        System.gc();
        System.out.println("Garbage collection suggested.");
    }
}
```

#### 5.2 加载本地库

可以使用`System.loadLibrary`方法加载本地库,例如动态链接库(DLL)或共享对象(SO)。这对于需要与本地代码交互的应用程序非常有用:

```java
public class Main {
    static {
        System.loadLibrary("nativeLib");
    }

    public static void main(String[] args) {
        System.out.println("Native library loaded.");
    }
}
```

在上述代码中,静态代码块中调用`System.loadLibrary`方法加载名为`nativeLib`的本地库。

#### 5.3 终止Java虚拟机

可以使用`System.exit`方法终止Java虚拟机并返回一个状态码:

```java
public class Main {
    public static void main(String[] args) {
        System.out.println("Exiting...");
        System.exit(0);
    }
}
```

在上述代码中,调用`System.exit(0)`终止Java虚拟机,并返回状态码0表示正常退出。

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

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

相关文章

【记录46】【案例】echarts 柱状图

echarts环境4.1.0 <template><div id"threefour"></div> </template> <script> import * as echarts from "echarts" export default {name:"",components:{},data(){return {}},methods:{getdata(){var myChart…

《平衡小车控制系统》电子设计大赛校赛感悟

我们学校举行了一次电子设计大赛选拔赛&#xff0c;虽然我们在测试的时候全部都可以完成&#xff0c;最后考核的时候因为方案选择问题以及各种设计逻辑等原因没能成功晋级&#xff0c;但我能从这次备赛中学到很多东西&#xff0c;遂分享一下&#xff0c;与广大网友交流经验。&a…

英伟达发布开源模型Nemotron-4 340B

&#x1f680; 英伟达发布开源模型Nemotron-4 340B 摘要&#xff1a;英伟达最新发布的开源模型Nemotron-4 340B&#xff0c;可能彻底改变大语言模型&#xff08;LLM&#xff09;训练方式。该模型支持多种自然语言和编程语言&#xff0c;使用9万亿个token训练&#xff0c;高达9…

Day 26:2288. 价格减免

Leetcode 2288. 价格减免 句子 是由若干个单词组成的字符串&#xff0c;单词之间用单个空格分隔&#xff0c;其中每个单词可以包含数字、小写字母、和美元符号 ‘$’ 。如果单词的形式为美元符号后跟着一个非负实数&#xff0c;那么这个单词就表示一个 价格 。 例如 “$100”、…

Windows系统部署本地SQL_Server指引

Windows系统部署本地SQL_Server指引 此指引文档环境为Windows10系统&#xff0c;部署SQL_Server 2019为例&#xff0c;同系列系统软件安装步骤类似。 一、部署前准备&#xff1b; 下载好相关镜像文件&#xff1b;设备系统启动后&#xff0c;将不必要的软件停用&#xff0c;避…

TTL 232难兄难弟对比

目录 一、TTL电平 二、RS-232电平 三、对比 TTL电平和RS-232电平是两种在电子通信中常用的电平标准&#xff0c;它们在电压范围、极性、接口标准以及应用场景等方面存在显著差异。以下是对这两种电平标准的对比、优缺点分析及图形对比的说明&#xff1a; 一、TTL电平 电压范…

【Linux】shell——条件判断test,各种运算符,expr

条件判断——test 真——0 假——1 test expression or [ expression ] 整数运算符 字符串运算符 -z 长度是否为0 -n 长度是否不为0 str1 str2 str1 ! str2 补 &&-->逻辑与&#xff0c;前面为真后面才会执行 || -->逻辑或&#xff0c;前面为假后面才…

VirtFuzz:一款基于VirtIO的Linux内核模糊测试工具

关于VirtFuzz VirtFuzz是一款功能强大的Linux内核模糊测试工具&#xff0c;该工具使用LibAFL构建&#xff0c;可以利用VirtIO向目标设备的内核子系统提供输入测试用例&#xff0c;广大研究人员可以使用该工具测试Linux内核的安全性。 工具要求 1、Rust&#xff1b; 2、修补的Q…

线代的学习(矩阵)

1.矩阵的乘法 矩阵实现满足&#xff1a;内标相等 矩阵相乘之后的结果&#xff1a;前行后列 需要注意&#xff1a;1.矩阵的乘法不具有交换律&#xff1a;AB!BA 2.矩阵的乘法满足分配律&#xff1a;A(BC) AB AC 抽象逆矩阵求逆矩阵 方法1.凑定义法、 方法2.长除法 数字型矩阵…

算法金 | 一个强大的算法模型:t-SNE !!

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 t-SNE&#xff08;t-Distributed Stochastic Neighbor Embedding&#xff09;是一种用于降维和数据可视化的非线性算法。它被广泛应用于…

LeetCode 算法:合并两个有序链表 c++

原题链接&#x1f517;&#xff1a;合并两个有序链表 难度&#xff1a;简单⭐️ 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;…

AI智能盒子助力中钢天源设备工厂升级安全防护

中钢集团安徽天源科技股份有限公司成立于2002年3月27日,是中央企业中国中钢股份有限公司控股的上市公司&#xff0c;主导产品为永磁铁氧体器件、钕铁硼器件、四氧化三锰、锶铁氧体预烧料及各类磁选机等。 在中钢天源智能化升级过程中&#xff0c;采用并定制开发一系列厂区安全…

QT day02

思维导图 UI界面设计 设置登录界面&#xff0c;输入账号、密码&#xff0c;登录/取消 按钮 使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义…

【随想】今日收获

【1】在写项目代码时&#xff0c;能用const的地方就用const。理由有两个&#xff1a;①可读性高&#xff1a;对于其他开发人员&#xff0c;看到const修饰形参就知道该函数内部不会修改该形参。②安全性高&#xff1a;const能够避免某些属性被更改。③延长声明周期&#xff1a;c…

实体类的注解

Data 是 lombok 的注解&#xff0c;自动生成Getter&#xff0c;Setter&#xff0c;toString&#xff0c;构造函数等 Entity&#xff1a;必须项&#xff0c; 注解这是个实体类&#xff0c;数据库中创建的表名默认和类名一致 Table&#xff08;name“”,catalog“”,schema“”…

Python期末复习题库(上)

1. (单选题) Python源程序的扩展名为&#xff08; A &#xff09; A. py B. c C. class D. ph 2. (单选题) 下列&#xff08; A &#xff09;符合可用于注释Python代码。 A. # B. */ C. // D. $ 3. (单选题)下列关于Python 语言的特点的说法中&#xff0c;错误的是&#xf…

【Linux基础IO】常见的对文件操作的函数、文件描述符fd、访问文件的本质分析

目录 fopen函数 chdir函数 fclose函数 fwrite和fread函数 open函数 umask函数 write函数 read函数 close函数 文件描述符fd 进程访问文件的本质分析 fopen函数 参数mode&#xff1a; w方式打开文件&#xff1a;1、如果被打开文件不存在&#xff0c;系统会在使用fopen函…

6、while循环 - 习题解析

目录 解析部分&#xff1a;分支练习1244. 请问一个正整数能够整除几次2问题描述解题思路代码实现代码解析 1062. 求落地次数问题描述解题思路代码实现代码解析 1254. 求车速问题描述解题思路代码实现代码解析 1261. 韩信点兵问题描述解题思路代码实现代码解析 解析部分&#xf…

数据结构习题

第一章 绪论 与数据元素本身的形式、内容、相对位置、个数无关的是数据的 逻辑结构。 第二章 线性表 在一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变&#xff0c;平均要移动的元素个数为 63.5。 n/2 单链表的存储密度 小于1。 创建一个包括n个结点的有序单链…

汇编语言实验五、子程序和宏

1、编写子程序&#xff0c;传递一个字节无符号数组&#xff0c;返回最大值。要求用堆栈传递入口参数&#xff0c;返回值在al。 .MODEL SMALL,C .STACK 100H .DATA buf db 11h,33h,88h,55h,66h,44h,99h,22h,77h,01h buf_l equ lengthof buf buf_t equ type buf m db ? .CODE m…