java-System 概述 1

embedded/2025/2/23 2:49:04/

## 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.ppmy.cn/embedded/50391.html

相关文章

18.1 HTTP服务器-极简服务器、请求与响应

1. 极简服务器 大道至简。使用Go语言构建世界上最简单的HTTP服务器&#xff0c;仅需四行代码。 标准库的net/http包提供了多种用于创建HTTP服务器的方法&#xff0c;其中包括&#xff1a; http.HandleFunc("/", rootHandler) 第一参数&#xff1a;访问的url 第二…

嵌入式中间件_3.嵌入式中间件的一般架构

根据嵌入式中间件的不同类型和其应用对象的不同&#xff0c;其架构也有所不同&#xff0c;通常嵌入式中间件没有统一的架构&#xff0c;这里仅仅列举两种中间件架构。 1.消息中间件 1.1消息中间件原理架构 消息中间件是消息传输过程中保存消息的一种容器。它将消息从它的源中…

C++ bfS

岛屿的最大面积 . - 力扣&#xff08;LeetCode&#xff09; 1.刚开始mn又加了int 2.bfs里符合条件了&#xff0c;不push&#xff0c;&#xff0c;&#xff0c;在写什么几把 class Solution { public:int dx[4] {0, 0, 1, -1};int dy[4] {1, -1, 0, 0};bool vis[50][50];int…

SpringBoot快速入门-上

Apache Tomcat Apache Tomcat是一个开源的Servlet 或 web容器&#xff0c;它实现了Java Servlet、JavaServer Pages (JSP)、Java Unified Expression Language (JUEL) 和 Java WebSocket 规范。 使用 官网下载 安装:绿色版 , 直接解压 卸载:直接删除目录 改编码: # conf/l…

Spring Boot定时任务编程指南:如何创建和配置周期性任务

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f525; 微信&#xff1a;zsqtcyw 联系我领取学习资料 …

Linux操作系统学习:day03

内容来自&#xff1a;Linux介绍 视频推荐&#xff1a;[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( 目录 day0317、创建删除目录创建目录删除目录 18、文件的拷贝19、mv 命令20、查看文件内容的相关命令21、给文件创建软连接或硬链接 day03 …

探索C嘎嘎的奇妙世界:第十四关---STL(string的模拟实现)

1. string类的模拟实现 1.1 经典的string类问题 上一关已经对string类进行了简单的介绍&#xff0c;大家只要能够正常使用即可。在面试中&#xff0c;面试官总喜欢让学生自己来模拟实现string类&#xff0c;最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数…

Node.js中基于node-schedule实现定时任务之详解

文章目录 一、定时任务二、node-schedule、1、安装2、引入3、基于Cron表达式的规则4、基于Date的规则5、基于RecurrenceRule的规则6、API7、状态监听 一、定时任务 实际工作中&#xff0c;可能会遇到定时清除某个文件夹内容&#xff0c;定时发送消息或发送邮件给指定用户&…