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 ...
随机推荐
- Linux-文件指令-cat-less-head-touch
- Linux-定时任务-cron
- 【Mysql系列】(二)日志系统:一条更新语句是如何执行的
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 这篇文章是从Github ReadMe拷贝的,内容实践下载是没问题的,能够正 ...
- [转帖]linux之iftop命令
https://rumenz.com/rumenbiji/linux-iftop.html Linux安装iftop > yum install iftop -y > iftop 界面如下 ...
- [转帖]TiDB 数据库核心原理与架构 [TiDB v6](101)笔记
https://www.jianshu.com/p/01e49a93f671 description: "本课程专为将在工作中使用 TiDB 数据库的开发人员.DBA 和架构师设计. 本门课 ...
- [转帖]TiUP 常见运维操作
https://docs.pingcap.com/zh/tidb/stable/maintain-tidb-using-tiup 本文介绍了使用 TiUP 运维 TiDB 集群的常见操作,包括查看集群 ...
- [转帖]redis进程绑定指定的CPU核
文章系转载,便于分类和归纳,源文地址:https://blog.csdn.net/youlinhuanyan/article/details/99671878 1)查看某服务的pid $ ps -au ...
- ARM 平台Docker运行RabbitMQ 以及迁移的简单办法
公司网络很垃圾. 可以使用vps 进行下载和打包 放到 公司的机器上面进行使用. 1. 搜索有没有可用的镜像. [root@JNXLH ~]# docker search rabbitmq |gre ...
- K8S 知识点
1. K8S集群大小 在 v1.7 版本中,Kubernetes 支持集群节点(node)数可达1000个.更具体地说,我们配置能够支持所有如下条件: 不超过2000个节点 不超过总共6000个 po ...
- AI五子棋 C++ 借助图形库raylib和raygui 设计模式思考过程和实现思路总结
转载请注明 原文链接 :https://www.cnblogs.com/Multya/p/17988499 repo: https://github.com/Satar07/AI_GoBang_Pub ...