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 ...
随机推荐
- Go-稀疏数组
package main import "fmt" // 稀疏数组 // 1. 二维数组 // 2. 存在大量相同相同数据和少量不同数据 // 思维: 将大量相同数据转化为: (数 ...
- [转帖]Java 容器化的历史坑(史坑) - 资源限制篇
原文:https://blog.mygraphql.com/zh/posts/cloud/containerize/java-containerize/java-containerize-resour ...
- 有趣的Shell脚本学习
有趣的Shell脚本学习 倒计时脚本 #!/bin/bash echo 20秒倒计时开始: tput sc # 循环40秒 for count in `seq 0 20` do tput rc tpu ...
- [转帖]一本正经的八卦一下CPU的自主可控 之二
https://zhuanlan.zhihu.com/p/62399200 一本正经的八卦一下CPU的自主可控 之二 上回书说到CPU自主可控第一个层面的指令集问题.这回聊一聊接下来的设计问题. 第二 ...
- nginx 企业版与开源版本的区别
- echarts设置单位的偏移
echarts 可以设置的echarts单位的偏移位置吗? 之前是知道echarts的X和Y是可以设置单位的. 但是设置单位的位置一直不好调整. 现在有时间,我们会回答一下上面标题的问题? echar ...
- TypeScript中的元组 Tuple
元组类型 // 元组类型:表示一个已知元素数量和类型的数组,各元素的类型不必相同 let undata: [string, '男'| '女']; //已知数量是两个.类型分别是字符串和男或者女 und ...
- golang实现的 https 协议的四层代理和七层代理
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 四层代理 在 tcp 这一层转发很简单. http 协议是 ...
- windbg-windows调试工具来抓端游crash dump
windbg下载有两种方式: Install WinDbg - Windows drivers | Microsoft Learn 从微软应用商店下载 dump上的windows的局部变量解析部分进行 ...
- c和c++开发工具之clion和vs
个人体验结果 如果是CMake或者要跨平台的话,建议使用CLion 像我在看书写练习题的话,Clion使用cmake编译c/c++源码更简单上手使用. 如果项目不大,两者都可以.如果关联子项目或第三方 ...