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. MongoDB 部署副本集 + 代码中开启事务

    首先,指定副本名称: vim /etc/mongod.conf replication: replSetName: shard1 在replication里面加入副本名称,多个相同副本,应该使用同样的 ...

  2. GoMusic-歌单迁移工具网站 一键迁移网易云/QQ音乐歌单至 Apple/Youtube/Spotify Music

    GoMusic是什么: GoMusic是一个在线歌单迁移工具网站,帮助用户一键迁移网易云/QQ音乐歌单至 Apple/Youtube/Spotify Music,直接输入歌单链接,复制查询结果,打开 ...

  3. [转帖]ORA-01450 maximum key length (3215) exceeded

    一. 问题背景 给一个业务表online建索引时遇到了ORA-01450 maximum key length (3215) exceeded报错,看字面意思是字段太长了,检查表字段类型发现基本都是n ...

  4. [转帖]TiDB Lightning 监控告警

    https://docs.pingcap.com/zh/tidb/v6.5/monitor-tidb-lightning tidb-lightning 支持使用 Prometheus 采集监控指标 ( ...

  5. 【转帖】【奇技淫巧】Linux | 安全保障防火墙-iptables

    虽然说Linux在安全方面确实相当于windows要更加可靠一些,但一般使用其作为服务器的我们,也不能大意,也是需要严格限制网络传输过程中的出入规则.上篇文章我们有聊到统计网络的信息,这篇文章来学习一 ...

  6. 【转帖】基于官方rpm包方式安装Oracle19c

    https://blog.whsir.com/post-5489.html   本文基于Centos7.x环境,通过官方提供的rpm包来安装19c 1.下载Oracle19c安装包 https://w ...

  7. [转帖]疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高?

    疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高? 因为存在CPU上下文切换. linux系统说明 Linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行.当然,这些 ...

  8. 【转贴】libcrypto.so.10丢失导致sshd无法运行解决方案

    http://www.cnblogs.com/billy98/p/4226023.html libcrypto.so.10丢失导致sshd无法运行解决方案 服务器由于掉电开启系统后无法远程ssh,重启 ...

  9. 分析fastcache和freecache(一)

    分析fastcache和freecache(一) fastcache和freecache是两个比较简单的缓存实现,下面分析一下各自的实现,并学习一下其实现中比较好的方式. fastcache 概述 f ...

  10. Skia 编译及踩坑实践

    本文要点 •了解并入门 Skia.OpenGL 和 Vulkan •了解 Skia 在后端渲染上的坑点 前言 Skia 是什么 Skia 是一个开源 2D 图形库,提供可跨各种硬件和软件平台工作的通用 ...