java.lang.System快速指南
最后修改:2019年5月7日,
1.概述
在本教程中,我们将快速浏览有类及其特性和核心功能。
2.IO
系统是一部分. lang,它的主要特性之一是允许我们访问标准I/O流。
简单地说,它公开了三个字段,每个字段对应一个流:
- 出
- 犯错
- 在
2.1。system . out
system . out指向标准输出流,将其公开为PrintStream,我们可以使用它来将文本打印到控制台:
system . out。打印(“一些内联消息”);
的高级用法系统是调用System.setOut,我们可以使用它来自定义位置system . out会写:
//重定向到文本文件系统。一套(新PrintStream(“filename.txt”);
2.2。System.err
System.err很像system . out。这两个字段都是PrintStream,两者都用于将消息打印到控制台。
但System.err表示标准错误,我们专门使用它来输出错误消息:
System.err。print("一些内联错误消息");
控制台通常会呈现不同于输出流的错误流。
如需更多信息,请查看PrintStream文档。
2.3。系统
系统指出标准,暴露它作为一个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时,应用程序停止并等待来自标准in的输入。无论下一个长度字节将从流中读取并存储在字节数组中。
用户键入的任何其他内容都保留在流中他在等另一个电话阅读。
当然,在这么低的水平上操作是很有挑战性的,而且很容易出错,所以我们可以稍微清理一下BufferedReader:
public String readUsername() throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(system .));返回reader.readLine ();}
按照上述安排,readLine会读的系统直到用户点击return,这更接近我们的预期。
注意,在这种情况下,我们故意不关闭流。关闭的标准在意味着在程序的生命周期中不能再次读取它!
最后,一个高级用法系统是调用System.setIn重定向到不同的InputStream。
3.实用方法
系统为我们提供了很多方法来帮助我们,比如:
- 访问控制台
- 复制数组
- 观测日期和时间
- 退出JRE
- 访问运行时属性
- 访问环境变量和
- 垃圾收集管理
3.1。访问控制台
Java 1.6引入了与控制台交互的另一种方式,而不仅仅是简单的使用system . out和在直接。
我们可以通过调用来访问它System.console:
public String readUsername() {Console Console = System.console();返回控制台== null ?空:控制台。readLine("%s", "Enter your name: "); }
注意,根据底层操作系统以及我们启动Java来运行当前程序的方式,控制台可能会返回空,所以在使用前一定要检查。
检查控制台更多用途的文档。
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);
但是,我们可以指定两个数组的起始位置,以及要复制多少个元素。
例如,我们想要从一个,从一个[1]来b,从b [3]:
System.arraycopy(a, 1, b, 3, 2); assertArrayEquals(new int[] {0, 0, 0, 22, 44, 0}, b);
同时,也要记住,arraycopy将把:
- NullPointerException如果任意一个数组零
- IndexOutOfBoundsException如果复制引用了超出其范围的任何一个数组
- ArrayStoreException如果复制导致类型不匹配
3.3。观测日期和时间
有两种方法与时间相关系统。一个是currentTimeMillis另一个是nanoTime。
currentTimeMillis返回自Unix纪元以来经过的毫秒数,即UTC时间1970年1月1日12:00:
public long nowPlusOneHour() {return System.currentTimeMillis() + 3600 * 1000L;} public String nowprettyprint(){返回新的日期(System.currentTimeMillis()).toString();}
nanoTime返回相对于JVM启动的时间。我们可以多次调用它来标记应用程序中时间的流逝:
long startTime = System.nanoTime();/ /……long endTime = System.nanoTime();assertTrue(endTime - startTime < 10000);
注意,因为nanoTime细粒度,这样做更安全endTime—startTime < 10000比endTime <开始时间由于数值溢出的可能性。
3.4。退出程序
如果我们想以编程方式退出当前执行的程序,system . 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");}系统。setProperty(“abckey”、“abcvaluefoo”);assertequal(“abcvaluefoo System.getProperty (abckey "));System.clearProperty(“abckey”);assertNull (System.getProperty(“abckey”));
通过指定的属性- d可以通过访问getProperty。
我们也可以提供一个默认值:
System.clearProperty(“dbHost”);myKey = System。getProperty("dbHost", "db.host.com"); assertEquals("db.host.com", myKey);
和System.getProperties提供所有系统属性的集合:
属性属性= System.getProperties();
从中我们可以做任何属性操作:
public void clearAllProperties() {System.getProperties().clear();}
3.6。访问环境变量
系统还提供对环境变量的只读访问采用。
如果我们想要访问路径例如,环境变量,我们可以做:
public String getPath() {return System.getenv("PATH");}
3.7。垃圾收集管理
通常,垃圾收集工作对我们的程序是不透明的。不过,有时我们可能想直接向JVM提出建议。
System.runFinalization是一种方法,允许我们建议JVM运行它的finalize例程。
system . gc是一个允许我们建议JVM运行其垃圾收集例程的方法。
因为这两个方法的契约不能保证终结或垃圾收集将会运行,所以它们的用处是有限的。
然而,它们可以作为优化(比如调用)来执行gc当桌面应用最小化时:
public void windowStateChanged(windowStateChanged(windowstate event)) {if (event == windowstate event);WINDOW_DEACTIVATED) {System.gc();//如果它最终运行,很好!}}
更多关于最终定稿的信息,请查看我们的完成向导。
4.结论
在本文中,我们了解了一些字段和方法系统提供了。完整的列表可以在官方系统文档。
另外,查看本文中的所有示例在Github。