滚雪球学Java(44):掌握Java编程的关键:深入解析System类

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【5月更文挑战第19天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

@[toc]

  在Java编程中,System类是一个非常重要的类,它提供了大量的系统级别的操作和属性。在本文中,我们将深入解析System类,掌握Java编程的关键。

前言

  Java作为一种广泛应用于各个领域的编程语言,其系统级别的操作和属性是我们必须掌握的知识点之一。而System类就是其中非常重要的一个类,通过学习System类,我们可以更好地理解和应用Java编程语言。

摘要

本文将深入解析System类,主要包括以下内容:

  • System类的基本概念和作用
  • System类的常用属性和方法
  • System类在Java编程中的应用

System类

概述

System类是Java.lang包中的一个类,它提供了一些静态方法,用于管理程序和系统的一些属性。它包括以下几个方法:

  • exit(int status):终止当前正在运行的Java虚拟机。
  • gc():请求系统进行垃圾回收。
  • currentTimeMillis():返回当前时间以毫秒为单位。
  • arraycopy(Object src, int srcPos, Object dest, int destPos, int length):将数组中指定范围内的元素复制到另一个数组中。
  • getProperty(String key):获取指定系统属性的值。
  • getProperty(String key, String defaultValue):获取指定系统属性的值,如果属性不存在则返回指定的默认值。

作用

  System类是Java.lang包下的一个类,它提供了大量的系统级别的属性和方法,可用于处理与系统相关的操作。例如,我们可以用System类获取系统的时间、内存信息、环境变量等等。

  在Java编程中,System类也经常被用于标准输入和标准输出,例如System.outSystem.in。通过System类,我们可以实现常见的输入输出操作,从而实现控制台程序开发。

源码分析

  System类是Java中的一个常用类,它提供了一些与系统相关的方法,如获取当前时间、处理输入输出流等。在本文中,我们将对System类的源码进行分析,以更深入地了解它的实现原理和使用方法。

下面是System类的源码:

public final class System {
   
   
    private System() {
   
   }

    public final static InputStream in = null;
    public final static PrintStream out = null;
    public final static PrintStream err = null;

    public static void setIn(InputStream in) {
   
    }
    public static void setOut(PrintStream out) {
   
    }
    public static void setErr(PrintStream err) {
   
    }

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

    public static native void exit(int status);
    public static native void gc();
    public static native String getenv(String name);
    public static native int identityHashCode(Object x);
    public static Properties getProperties() {
   
    }
    public static String getProperty(String key) {
   
    }
    public static String getProperty(String key, String def) {
   
    }
    public static String setProperty(String key, String value) {
   
    }
    public static String clearProperty(String key) {
   
    }
    public static String lineSeparator() {
   
    }
    public static void load(String filename) {
   
    }
    public static void loadLibrary(String libname) {
   
    }
}

  从源码中可以看到,System类是一个final类,不能被继承。它包含了一些静态变量和静态方法,其中大部分方法都是native方法,即使用C或C++编写的本地方法,系统自动调用。

方法说明

setIn、setOut、setErr方法

这三个方法分别设置标准输入流、标准输出流和标准错误流。这些流可以是任意的InputStream、PrintStream或者任意的派生类。当设置完这些流之后,调用System.in、System.out和System.err会使用新的流。

currentTimeMillis方法

这个方法返回自1970年1月1日00:00:00以来以毫秒为单位的当前时间。

arraycopy方法

这个方法将一个数组的元素复制到另一个数组中。src参数是源数组,srcPos是源数组中要复制的起始位置,dest是目标数组,destPos是目标数组中要复制的起始位置,length是要复制的元素数量。

exit方法

这个方法终止正在运行的Java虚拟机。status参数指定了退出状态码,为0表示正常退出,非0表示异常退出。

gc方法

这个方法请求系统进行垃圾回收。

getenv方法

这个方法获取系统环境变量的值。

identityHashCode方法

这个方法返回给定对象的哈希码。

getProperties方法

这个方法返回当前系统的属性集。

getProperty方法

这个方法获取指定的系统属性值。如果没有找到属性,则返回null。

setProperty方法

这个方法设置指定属性的值。

clearProperty方法

这个方法移除指定的属性。

lineSeparator方法

这个方法返回当前系统的行分隔符。

load方法和loadLibrary方法

这两个方法分别在指定的文件中加载一个属性列表和指定的动态链接库。

优缺点分析

优点:

  1. System类是Java语言中的一个标准类,可直接使用,无需额外导入。
  2. System类提供了许多常用的静态方法和属性,能够帮助我们获取系统信息、执行垃圾回收、获取当前时间等等。
  3. System类还提供了输入输出流相关的方法,如标准输入输出流的获取,重定向等,方便我们进行IO操作。

    缺点:

  4. System类中的方法都是静态方法,有一定的限制,不能被继承或重写。
  5. System类中的方法并不是线程安全的,可能会导致并发问题。
  6. System类中的方法实现可能存在平台依赖性,不同操作系统可能会有不同的实现。

    应用场景

    常见的应用场景如下:

  7. 获取系统信息,如系统的环境变量、系统属性等等。

  8. 获取当前时间,用于日志记录、任务计时等场景。
  9. 执行垃圾回收,手动回收无用的对象,提高系统性能。
  10. 进行IO操作,如获取输入输出流、重定向等等。

常用方法示例演示

System类提供的常用属性和方法如下:

System.exit(int status)

  该方法用于终止Java虚拟机,并返回一个指定的状态码。一般情况下,status为0表示正常退出,非零值表示异常退出。

代码演示:

例如:

package com.demo.javase.day44;

/**
 * 演示 System.exit(int status)
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/10/10 10:39
 */
public class TestSystemExit {
   
   

    public static void main(String[] args) {
   
   
        System.out.println("Hello World!");
        System.exit(0);
        System.out.println("Hello World!!!"); //不会被执行(控制台不会输出)
    }
}

执行结果:

执行结果如下:

在这里插入图片描述

代码解析:

这段代码中包含了一个静态方法 main。在该方法中:

  • 第一行输出了一句话 "Hello World!"。

  • 第二行调用了 System.exit(0) 方法,该方法会使程序正常退出,并返回一个状态码 0。

  • 第三行的代码不会被执行,因为前一行已经使程序退出了。

  因此,该程序在执行时只会输出一句话 "Hello World!",并且状态码为 0。

System.currentTimeMillis()

  该方法返回当前时间与1970年1月1日00:00:00之间的差值,单位为毫秒。

代码演示:

例如:

package com.demo.javase.day44;

/**
 * 演示 System.currentTimeMillis()
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/10/10 10:47
 */
public class TestSystemCurrentTimeMillis {
   
   

    public static void main(String[] args) throws InterruptedException {
   
   
        long startTime = System.currentTimeMillis();
        System.out.println("开始时间为:" + startTime);

        // 执行一些耗时的操作(这里线程睡眠5s作为模拟)
        Thread.sleep(5000);

        long endTime = System.currentTimeMillis();
        System.out.println("结束时间为:" + endTime);
        System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
    }
}

执行结果:

执行结果如下:

在这里插入图片描述

代码解析:

  该段代码演示了如何使用Java中的System类的currentTimeMillis()方法来计算程序的执行时间。

  • 首先,我们获取程序开始执行时的时间戳,即System.currentTimeMillis()的返回值,并将其保存在startTime变量中。

  • 接着,我们模拟了一些耗时的操作,这里使用Thread.sleep()方法让线程休眠了5秒钟。

  • 最后,我们获取程序结束执行时的时间戳,并将其保存在endTime变量中。

  最后,我们通过计算endTime与startTime的时间差来计算程序的运行时间,并将其打印输出。

  该程序的核心是利用currentTimeMillis()获取时间戳,然后通过计算时间差来计算程序运行时间,是一种简单而有效的计时方法。

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

  该方法用于将数组src中从索引srcPos开始的length个元素复制到数组dest中的索引destPos开始的位置。

代码演示:

例如:

package com.demo.javase.day44;

import java.util.Arrays;

/**
 * 演示 System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/10/10 10:52
 */
public class TestSystemArraycopy {
   
   

    public static void main(String[] args) {
   
   
        int[] src = {
   
   1, 2, 3, 4, 5};
        int[] dest = new int[5];
        System.arraycopy(src, 0, dest, 0, 5);
        System.out.println(Arrays.toString(dest));
    }
}

执行结果:

执行结果如下:

在这里插入图片描述

代码解析:

  这是一个演示使用 System.arraycopy() 方法进行数组复制的示例代码。该方法的参数包括源数组、源数组的起始位置、目标数组、目标数组的起始位置以及要复制的数组元素个数。在这个示例中,源数组是 {1, 2, 3, 4, 5},目标数组是一个长度为 5 的空数组,通过该方法将源数组的所有元素复制到目标数组中,最终打印输出目标数组的元素,即 {1, 2, 3, 4, 5}。

System.getenv(String name)

该方法用于获取系统环境变量name的值。

代码演示:

例如:

package com.demo.javase.day44;

/**
 * 演示 System.getenv(String name)
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/10/10 10:55
 */
public class TestSystemGetenv {
   
   

    //获取系统环境变量name的值
    public static void main(String[] args) {
   
   
        String javaHome = System.getenv("JAVA_HOME");
        System.out.println("JAVA_HOME:" + javaHome);

        System.out.println("CLASSPATH:"+System.getenv("CLASSPATH"));
    }
}

执行结果:

执行结果如下:

在这里插入图片描述

代码解析:

  这段代码演示了如何使用Java的System类中的getenv方法获取系统环境变量的值。其中,通过传入不同的参数获取不同的环境变量值,例如获取JAVA_HOME的值和CLASSPATH的值。最终,将获取到的值打印输出到控制台。

System.getProperties()

该方法返回一个Properties对象,包含了当前Java虚拟机的系统属性。

代码演示:

例如:

package com.demo.javase.day44;

import java.util.Enumeration;
import java.util.Properties;

/**
 * 演示 System.getProperties()方法
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/10/10 11:00
 */
public class TestSystemGetProperties {
   
   

    //返回一个Properties对象,包含了当前Java虚拟机的系统属性
    public static void main(String[] args) {
   
   
        Properties props = System.getProperties();
        Enumeration<?> e = props.propertyNames();
        while (e.hasMoreElements()) {
   
   
            String key = (String) e.nextElement();
            String value = (String) props.get(key);
            System.out.println(key + " = " + value);
        }
    }
}

执行结果:

执行结果如下:

在这里插入图片描述

代码解析:

  这段代码演示了使用 System.getProperties() 方法获取当前 Java 虚拟机的系统属性,然后通过遍历 properties 对象中的键值对将其输出到控制台。

具体解析如下:

  1. 导入必要的类:
import java.util.Enumeration;
import java.util.Properties;
  1. 定义 main() 方法,获取当前 Java 虚拟机的系统属性:
public static void main(String[] args) {
   
   
    Properties props = System.getProperties();
    // ...
}

  其中,System.getProperties() 方法返回一个 Properties 对象,包含了当前 Java 虚拟机的系统属性。

  1. 遍历 properties 对象中的键值对,将其输出到控制台:
Enumeration<?> e = props.propertyNames();
while (e.hasMoreElements()) {
   
   
    String key = (String) e.nextElement();
    String value = (String) props.get(key);
    System.out.println(key + " = " + value);
}

  其中,props.propertyNames() 方法返回一个枚举类型的对象,该对象包含了 properties 对象中的所有键的枚举。

  然后使用 while 循环遍历该枚举对象,获取每个键值对的键和值,最后将其输出到控制台。

  因此,此段代码的作用是输出当前 Java 虚拟机的所有系统属性。

System.setOut(PrintStream out)

该方法用于将System.out设置为指定的输出流out。

代码演示:

例如:

package com.demo.javase.day44;

import java.io.FileOutputStream;
import java.io.PrintStream;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/10/10 11:02
 */
public class TestSystemSetOut {
   
   

    //该方法用于将System.out设置为指定的输出流out
    public static void main(String[] args) {
   
   
        try {
   
   
            PrintStream out = new PrintStream(new FileOutputStream("output.txt"));
            System.setOut(out);
            System.out.println("Hello World!");
            out.close();
        } catch (Exception e) {
   
   
            e.printStackTrace();
        }
    }
}

执行结果:

执行结果如下:

在这里插入图片描述

代码解析:

  该代码演示了如何将Java程序中的标准输出流System.out设置为指定的输出流,具体步骤如下:

  1. 使用Java IO API中的FileOutputStream类创建一个输出流,输出到指定文件output.txt中。

  2. 使用PrintStream类对输出流进行包装,方便进行输出操作。

  3. 使用System.setOut()方法将标准输出流System.out设置为指定的输出流out。

  4. 使用System.out.println()方法输出信息,此时输出的内容将会被重定向到指定的文件output.txt中。

  5. 关闭输出流。

  该代码的运行结果是,在程序执行完毕后,会在项目根目录下生成一个名为output.txt的文件,其中包含了输出的信息"Hello World!"。

System类在Java编程中的应用

  System类在Java编程中有广泛的应用,主要包括以下方面:

  • 输入输出操作:例如System.outSystem.inSystem.err等。
  • 系统信息获取:例如System.currentTimeMillis()System.getProperties()System.getenv()等。
  • 数组复制操作:例如System.arraycopy()等。
  • 程序退出操作:例如System.exit()等。

  通过学习System类,我们可以更好地应用Java编程语言,实现更加高效、稳定和可靠的程序开发。

小结

  通过本文的讲解,我们对System类的基本概念和作用有了更加深入的理解,掌握了System类的常用属性和方法,了解了System类在Java编程中的应用,相信对我们的Java编程之路有着重要的意义。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

总结

  Java是一种广泛应用于各个领域的编程语言,而System类是其中非常重要的一个类,通过它我们可以更好地处理与系统相关的操作。希望本文对您有所帮助,祝您在Java编程之路中取得更加优异的成绩!

☀️建议/推荐你


  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。


目录
相关文章
|
5天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
51 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
12天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
12天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
10天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
1月前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
1月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
2月前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
2月前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
37 1
|
2月前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
52 3
|
3月前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。

热门文章

最新文章

推荐镜像

更多