java.lang.System快速指南
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快速指南的更多相关文章
- java能不能自己写一个类叫java.lang.System/String正确答案
原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.S ...
- Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
最近下载一个新版本的adt-bundle,Android API是20. 把Plain Text控件往布局上面拖时,发现拖不上去,出现了下面的错误: Exception raised during r ...
- 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 ...
- ECLIPSE android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
在布局添加控件手动添加还是拖的添加,添加edittext后布局就不好用,其他控件好用,然后就说下面这段话 Exception raised during rendering: java.lang.Sy ...
- android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
今天在看布局文件的时候出现 android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[ ...
- java.lang.system 类源码解读
通过每块代码进行源码解读,并发现源码使用的技术栈,扩展视野. registerNatives 方法解读 /* register the natives via the static initializ ...
- void java.lang.System.gc()
void java.lang.System.gc() Runs the garbage collector. Calling the gc method suggests that the Java ...
- java.lang.System.setProperty()方法实例
java.lang.System.setProperty() 方法设置指定键指定的系统属性. 声明 以下是java.lang.System.setProperty()方法的声明 public stat ...
- java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别
java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别 一.java.lang.System.arraycopy() 该方法的声明: /* ...
- java.util.Arrays,java.lang.Math,java.lang.System 类的常用方法汇总
java.util.Arrays类是数组的工具类,一般数组常用的方法包括 二分查找:public static int binarySearch(array[],int key),返回key的下标i ...
随机推荐
- MongoDB 部署副本集 + 代码中开启事务
首先,指定副本名称: vim /etc/mongod.conf replication: replSetName: shard1 在replication里面加入副本名称,多个相同副本,应该使用同样的 ...
- GoMusic-歌单迁移工具网站 一键迁移网易云/QQ音乐歌单至 Apple/Youtube/Spotify Music
GoMusic是什么: GoMusic是一个在线歌单迁移工具网站,帮助用户一键迁移网易云/QQ音乐歌单至 Apple/Youtube/Spotify Music,直接输入歌单链接,复制查询结果,打开 ...
- [转帖]ORA-01450 maximum key length (3215) exceeded
一. 问题背景 给一个业务表online建索引时遇到了ORA-01450 maximum key length (3215) exceeded报错,看字面意思是字段太长了,检查表字段类型发现基本都是n ...
- [转帖]TiDB Lightning 监控告警
https://docs.pingcap.com/zh/tidb/v6.5/monitor-tidb-lightning tidb-lightning 支持使用 Prometheus 采集监控指标 ( ...
- 【转帖】【奇技淫巧】Linux | 安全保障防火墙-iptables
虽然说Linux在安全方面确实相当于windows要更加可靠一些,但一般使用其作为服务器的我们,也不能大意,也是需要严格限制网络传输过程中的出入规则.上篇文章我们有聊到统计网络的信息,这篇文章来学习一 ...
- 【转帖】基于官方rpm包方式安装Oracle19c
https://blog.whsir.com/post-5489.html 本文基于Centos7.x环境,通过官方提供的rpm包来安装19c 1.下载Oracle19c安装包 https://w ...
- [转帖]疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高?
疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高? 因为存在CPU上下文切换. linux系统说明 Linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行.当然,这些 ...
- 【转贴】libcrypto.so.10丢失导致sshd无法运行解决方案
http://www.cnblogs.com/billy98/p/4226023.html libcrypto.so.10丢失导致sshd无法运行解决方案 服务器由于掉电开启系统后无法远程ssh,重启 ...
- 分析fastcache和freecache(一)
分析fastcache和freecache(一) fastcache和freecache是两个比较简单的缓存实现,下面分析一下各自的实现,并学习一下其实现中比较好的方式. fastcache 概述 f ...
- Skia 编译及踩坑实践
本文要点 •了解并入门 Skia.OpenGL 和 Vulkan •了解 Skia 在后端渲染上的坑点 前言 Skia 是什么 Skia 是一个开源 2D 图形库,提供可跨各种硬件和软件平台工作的通用 ...