1.介绍

在本教程中,我们将快速了解java.lang.System类及其特性和核心功能。

2.IO

系统类是java.lang的一部分,它的一个主要特性是让我们能够访问标准的I/O流。

简单地说,它暴露了三个属性,每个流一个:

  • out
  • err
  • in

2.1 System.out

System.out指向标准输出流,将其暴露为PrintStream,我们可以使用它将文本打印到控制台:

System.out.print("This is a test message.");

System的一个高级用法是调用System.setOut,我们可以使用它自定义System.out将写入的位置:

// Redirect to a text file
System.setOut(new PrintStream("filename.txt"));

2.2 System.err

System.err很像System.out。这两个字段都是PrintStream的实例,都用于将消息打印到控制台。

但是System.err代表标准错误,我们专门用它来输出错误消息:

System.err.print("some inline error message");

控制台通常会以不同于输出流的方式呈现错误流。

有关更多信息,请查看 PrintStream 文档。

2.3 System.in

System.in指向中的标准输入,将其暴露为InputStream,我们可以使用它从控制台读取输入。

尽管有点复杂难懂,我们仍然可以这样做:

public String readUsername(int length) throws IOException {
byte[] name = new byte[length];
System.in.read(name, 0, length); // by default, from the console
return new String(name);
}

通过调用System.in.read,应用程序停止并等待标准的输入。无论下一个字节的长度是多少,都将从流中读取并存储在字节数组中。

用户输入的任何其他内容都保留在流中,等待另一个调用读取。

当然,在这样低的级别上操作会很有挑战性,而且容易出错,因此我们可以使用BufferedReader来处理:

public String readUsername() throws IOException {
BufferedReader reader = new BufferedReader(
new InputStreamReader(System.in));
return reader.readLine();
}

按照上面的处理,readLine将从System.in读取,直到用户回车,这种就是我们想要的。

注意,在这种情况下,我们故意不关闭流。关闭的话意味着在程序的生命周期内无法再次读取它!

最后,System.in的一个高级用法是调用System.setIn将其重定向到另一个InputStream。

3.工具方法

系统类还为我们提供了许多方法来帮助我们解决以下问题:

  • 访问控制台

  • 复制数组

  • 观察日期和时间

  • 退出JRE

  • 访问运行时属性

  • 访问环境变量,以及

  • 管理垃圾回收

3.1 访问控制台

Java1.6引入了另一种与控制台交互的方式,而不是直接使用System.out和in。

我们可以通过调用System.console来访问它:

public String readUsername() {
Console console = System.console(); return console == null ? null :
console.readLine("%s", "Enter your name: ");
}

注意,根据底层操作系统和我们如何启动Java来运行当前程序,console可能会返回null,所以在使用之前一定要检查

可以查看控制台文档了解更多用法。

3.2 复制数组

System.arraycopy是一种老式的C风格的方法,可以将一个数组复制到另一个数组中。

arraycopy主要用于将一个完整的数组复制到另一个数组中:

int[] a = {34, 22, 44, 2, 55, 3};
int[] b = new int[a.length]; System.arraycopy(a, 0, b, 0, a.length);
assertArrayEquals(a, b);

但是,我们可以指定两个数组的起始位置,以及要复制多少个元素。

例如,假设我们要从a复制2个元素,从a[1]开始复制到b,从b[3]开始:

System.arraycopy(a, 1, b, 3, 2);
assertArrayEquals(new int[] {0, 0, 0, 22, 44, 0}, b);

另外,请记住arraycopy将抛出:

  • NullPointerException(如果任一数组为null)

  • 如果副本引用的数组超出其范围,则发生IndexOutOfBoundsException

  • 如果复制导致类型不匹配,则返回ArrayStoreException

3.3 观察日期和时间

系统中有两种与时间相关的方法。一个是currentTimeMillis,另一个是nanoTime。

currentTimeMillis返回自Unix纪元(即1970年1月1日12:00 AM UTC)以来经过的毫秒数:

public long nowPlusOneHour() {
return System.currentTimeMillis() + 3600 * 1000L;
} public String nowPrettyPrinted() {
return new Date(System.currentTimeMillis()).toString();
}

nanoTime返回相对于JVM启动的时间。我们可以多次调用它来标记应用程序中的时间流逝:

long startTime = System.nanoTime();
// ...
long endTime = System.nanoTime(); assertTrue(endTime - startTime < 10000);

请注意,由于nanoTime是如此细粒度,因此执行endTime–startTime<10000比endTime<startTime更安全,因为可能会出现数值溢出。

3.4 退出程序

如果我们想以编程方式退出当前执行的程序,System.exit就可以了。

要调用exit,我们需要指定一个exit代码,它将被发送到启动程序的控制台或shell。

按照Unix中的约定,状态为0表示正常退出,而非0表示发生了一些错误:

if (error) {
System.exit(1);
} else {
System.exit(0);
}

请注意,对于现在的大多数程序来说,需要这样称呼是很奇怪的。例如,当在web服务器应用程序中调用时,它可能会关闭整个站点!

3.5 访问运行时属性

系统通过getProperty提供对运行时属性的访问。我们可以用setProperty和clearProperty来管理它们:

public String getJavaVMVendor() {
System.getProperty("java.vm.vendor");
} System.setProperty("abckey", "abcvaluefoo");
assertEquals("abcvaluefoo", System.getProperty("abckey")); System.clearProperty("abckey");
assertNull(System.getProperty("abckey"));

通过-D指定的属性可以通过getProperty访问。

我们还可以提供默认值:

System.clearProperty("dbHost");
String myKey = System.getProperty("dbHost", "db.host.com");
assertEquals("db.host.com", myKey);

System.getProperties提供了所有系统属性的集合:

Properties properties = System.getProperties();

从中我们能执行任何Properties操作:

public void clearAllProperties() {
System.getProperties().clear();
}

3.6 访问环境变量

系统还通过getenv提供对环境变量的只读访问。例如,如果要访问PATH环境变量,可以执行以下操作:

public String getPath() {
return System.getenv("PATH");
}

3.7 管理垃圾收集

通常,垃圾收集工作对我们的程序来说是不透明的。不过,有时我们可能希望向JVM提出一个直接的建议。 System.runFinalization是一种允许我们建议JVM运行finalization程序的方法。

gc是一种允许我们建议JVM运行其垃圾收集程序的方法。

由于这两种方法的契约不能保证终结或垃圾收集将运行,因此它们的用处很小。

但是,它们可以作为一种优化来使用,比如在桌面应用程序最小化时调用gc:

public void windowStateChanged(WindowEvent event) {
if ( event == WindowEvent.WINDOW_DEACTIVATED ) {
System.gc(); // if it ends up running, great!
}
}

java.lang.System快速指南的更多相关文章

  1. java能不能自己写一个类叫java.lang.System/String正确答案

    原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.S ...

  2. Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V

    最近下载一个新版本的adt-bundle,Android API是20. 把Plain Text控件往布局上面拖时,发现拖不上去,出现了下面的错误: Exception raised during r ...

  3. Spring MVC exception - Invoking request method resulted in exception : public static native long java.lang.System.currentTimeMillis()

    最近在线上系统发现下面的异常信息: 2014-10-11 11:14:09 ERROR [org.springframework.web.servlet.mvc.annotation.Annotati ...

  4. ECLIPSE android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V

    在布局添加控件手动添加还是拖的添加,添加edittext后布局就不好用,其他控件好用,然后就说下面这段话 Exception raised during rendering: java.lang.Sy ...

  5. android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V

    今天在看布局文件的时候出现 android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[ ...

  6. java.lang.system 类源码解读

    通过每块代码进行源码解读,并发现源码使用的技术栈,扩展视野. registerNatives 方法解读 /* register the natives via the static initializ ...

  7. void java.lang.System.gc()

    void java.lang.System.gc() Runs the garbage collector. Calling the gc method suggests that the Java ...

  8. java.lang.System.setProperty()方法实例

    java.lang.System.setProperty() 方法设置指定键指定的系统属性. 声明 以下是java.lang.System.setProperty()方法的声明 public stat ...

  9. java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别

    java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别 一.java.lang.System.arraycopy() 该方法的声明: /* ...

  10. java.util.Arrays,java.lang.Math,java.lang.System 类的常用方法汇总

    java.util.Arrays类是数组的工具类,一般数组常用的方法包括 二分查找:public static int  binarySearch(array[],int key),返回key的下标i ...

随机推荐

  1. Shell-流程控制-if-then-elif

  2. Net Core中使用EF Core连接Mysql数据库

    Entity Framework Core的前身是微软提供并主推的ORM框架,简称EF,其底层是对ADO.NET的封装.EF支持SQLServer.MYSQL.Oracle.Sqlite等所有主流数据 ...

  3. [转帖]TiKV读写流程浅析

    https://www.cnblogs.com/luohaixian/p/15227838.html 1.TiKV框架图和模块说明 图1  TiKV整体架构图 1.1.各模块说明 PD Cluster ...

  4. CoreMark简单学习

    CoreMark简单学习 下载 https://github.com/eembc/coremark-pro 需要注意, 其实coremark是有两组. 一组是coremark 一组是 coremark ...

  5. [转帖]JVM-工具-jcmd

    http://events.jianshu.io/p/011f0e3a39ff 一.jcmd 用法 1.1 基本知识 jcmd 是在 JDK1.7 以后,新增了一个命令行工具. jcmd 是一个多功能 ...

  6. Linux 查找并且复制部分文件到其他目录的办法(find xargs {})

    最近经常需要从某些文件夹查找部分文件,然后复制到其他目录里面进行进一步的处理 shell 脚本一直在不断的学习中, 最近发现之前看文档还是有疏漏. find . -iname "*fi*&q ...

  7. (数据科学学习手札76)基于Python的拐点检测——以新冠肺炎疫情数据为例

    本文对应代码.数据及文献资料已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes,对代码不感兴趣的朋友可以直接跳至2.2 探 ...

  8. Go泛型简介

    Go语言的泛型是在Go 1.18版本中引入的一个新特性,它允许开发者编写可以处理不同数据类型的代码,而无需为每种数据类型都编写重复的代码.以下是关于Go语言泛型的一些关键点: 泛型是通过在函数或类型定 ...

  9. LINQ分组排序后获取每组第一条记录

    当前有一张数据表{Student},包含了如下的字段信息: CREATE TABLE [dbo].[Student]( [Sno] [nchar](7) NOT NULL, [Sname] [ncha ...

  10. 剪粘板增强小工具(可多次Ctrl+V)

    前言 windows的剪贴板中存储是的最新一次的复制结果,比如先复制A,再复制B,C,在按下粘贴键时粘贴的是最后一次的结果C,在工作时有时候会遇到需要多次复制粘贴的情景,我就在思考有没有一款工具可以保 ...