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. Linux-文件指令-cat-less-head-touch

  2. Linux-定时任务-cron

  3. 【Mysql系列】(二)日志系统:一条更新语句是如何执行的

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 这篇文章是从Github ReadMe拷贝的,内容实践下载是没问题的,能够正 ...

  4. [转帖]linux之iftop命令

    https://rumenz.com/rumenbiji/linux-iftop.html Linux安装iftop > yum install iftop -y > iftop 界面如下 ...

  5. [转帖]TiDB 数据库核心原理与架构 [TiDB v6](101)笔记

    https://www.jianshu.com/p/01e49a93f671 description: "本课程专为将在工作中使用 TiDB 数据库的开发人员.DBA 和架构师设计. 本门课 ...

  6. [转帖]TiUP 常见运维操作

    https://docs.pingcap.com/zh/tidb/stable/maintain-tidb-using-tiup 本文介绍了使用 TiUP 运维 TiDB 集群的常见操作,包括查看集群 ...

  7. [转帖]redis进程绑定指定的CPU核

    文章系转载,便于分类和归纳,源文地址:https://blog.csdn.net/youlinhuanyan/article/details/99671878 1)查看某服务的pid $ ps -au ...

  8. ARM 平台Docker运行RabbitMQ 以及迁移的简单办法

    公司网络很垃圾. 可以使用vps 进行下载和打包  放到 公司的机器上面进行使用. 1. 搜索有没有可用的镜像. [root@JNXLH ~]# docker search rabbitmq |gre ...

  9. K8S 知识点

    1. K8S集群大小 在 v1.7 版本中,Kubernetes 支持集群节点(node)数可达1000个.更具体地说,我们配置能够支持所有如下条件: 不超过2000个节点 不超过总共6000个 po ...

  10. AI五子棋 C++ 借助图形库raylib和raygui 设计模式思考过程和实现思路总结

    转载请注明 原文链接 :https://www.cnblogs.com/Multya/p/17988499 repo: https://github.com/Satar07/AI_GoBang_Pub ...