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. [转帖]细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4

    https://www.cnblogs.com/malecrab/p/5300503.html 1. Unicode与ISO 10646 全世界很多个国家都在为自己的文字编码,并且互不想通,不同的语言 ...

  2. [转帖]SSL数字证书分类DV/OV/EV

    SSL证书的分类主要是通过下面两个维度进行分类: 1.根据验证模式分类 根据CA机构对申请者的身份审核范围分为:DV证书.OV证书.EV证书. 1.1.DV证书(域名证书) DV(Domain Val ...

  3. [转帖]Jmeter创建简单的HTTP(S)请求测试-3

    在上一章节中,介绍了Jmeter基本的组成组件,那么我们如何使用这些组件去完成测试呢,以下将通过创建一个简单的HTTP(S)测试进行说明,另外,除JDBC请求外,Jmeter进行测试构建的步骤大同小异 ...

  4. [转帖]THE OSWATCHER ANALYZER USER'S GUIDE

    oswbba THE OSWATCHER ANALYZER USER'S GUIDE Carl DavisMay 7, 2019 To see how to use this tool and it' ...

  5. [转帖]神秘的backlog参数与TCP连接队列

    https://www.cnblogs.com/codelogs/p/16060820.html 简介# 这要从一次压测项目说起,那是我们公司的系统与另几家同行公司的系统做性能比拼,性能数据会直接影响 ...

  6. [转帖]Linux系统中的Page cache和Buffer cache

    Free命令显示内存 首先,我们来了解下内存的使用情况: Mem:表示物理内存统计 total:表示物理内存总量(total = used + free) used:表示总计分配给缓存(包含buffe ...

  7. [转帖]【redis】redis各稳定版本特性(更新到6.0版本)

    1.Redis2.6 Redis2.6在2012年正是发布,经历了17个版本,到2.6.17版本,相对于Redis2.4,主要特性如下: 1)服务端支持Lua脚本. 2)去掉虚拟内存相关功能. 3)放 ...

  8. 热更新适配ibatis原理浅析

    一.热更新解决了什么问题? 在研发过程中,每个研发同学在联调.自测阶段中总会频繁的去执行编译.构建.打包的动作,遇到比较大的项目,执行一套流程下来,往往需要3-10分钟左右,极大的降低了研发的速度,基 ...

  9. 每日一道Java面试题:Java是值传递还是引用传递?

    写在开头 Java是值传递还是引用传递?这个问题几乎100%的出现在了各大主流Java面试题中,知识点很小,但很考验面试者对于Java运行的理解,今晚趁着生产投产的空子,过来小聊一下. 实参与形参 所 ...

  10. asp.net 生成word,处理图片,富文本框内容图片处理

    //基本导出方法public void Download() { Random rd = new Random(); string fileName = DateTime.Now.ToString(& ...