System类
System
类代表当前Java程序的运行平台,程序不能创建 System
类的对象,System
类提供了代表标准输入、标准输出和错误输出的类变量,并提供了一些静态方法用于访问环境变量、系统属性等,还提供了加载文件和动态链接库的方法。
常用方法
System
类的in,out,err
分别代表系统的标准输入(通常是键盘)、标准输出(通常是显示器)、错误输出流,并提供了setIn(),setOut(),setErr()
方法来改变系统的标准输入、标准输出、标准错误输出流。
方法 | 作用 |
---|---|
setIn() | 改变系统的标准输入流 |
setOut() | 改变系统的标准输出流 |
setErr() | 改变系统的标准错误输出流 |
getenv() | 所在平台的环境变量 |
getProperties() | 所在平台的系统属性 |
getProperty() | 所在平台的系统属性 |
currentTimeMillis() | 系统当前时间,返回一个long型的整数,以毫妙为单位 |
nanoTime() | 系统当前时间,返回一个long型的整数,以纳妙为单位 |
identityHashCode(Object x) | 根据对象的地址返回指定对象的精确散列码 |
gc() | 通过系统进行垃圾回收 |
runFinalization() | 通知系统进行资源清理 |
对于
setOut
方法,其会更改System.out
,但如果你去查看源代码,就会惊讶地发现out
是被final
修饰的public final static PrintStream out = null;
,那么为什么其仍然能修改呢?原因在于setOut
方法是一个原生方法,它不是在 java 语言中实现的。原生方法可以绕过 java 语言的访问控制机制。这是一种特殊的解决方法,自己在写程序时不要模仿这种做法。
加载文件和动态链接库主要对 native
方法有用,对于一些特殊的功能(如访问操作系统底层硬件设备等)Java程序无法实现,必须借助C语言来完成,此时需要使用C语言为Java方法提供实现。
格式化输出
System.out.printf()
方法可以格式化输出字条串,其中以%开始的为格式说明符,在打印时会以特定的内容和格式对其进行替换。
转换符 | 类型 | 示例 |
---|---|---|
d | 十进制整数 | 159 |
x | 十六进制整数 | 9f |
o | 八进制整数 | 237 |
f | 定点浮点数 | 15.9 |
e | 指数浮点数 | 1.59e+01 |
g | 通用浮点数(e和f中较短的一个) | |
a | 十六进制浮点数 | 0x1.fccdp3 |
s | 字符串 | Hello |
c | 字符 | H |
b | 布尔 | true |
h | 散列码 | 42628b2 |
tx或Tx | 日期时间(T强制大写) | 已过时,应使用java.time类 |
% | 百分号 | %d |
n | 与平台有关的行分隔符 |
另外,还可以指定控制格式化输出外观的各种标志,如逗号标志可以增强分组分隔符,即System.out.printf("%,.2f", 10000.0 / 3.0);
会打印3,333.33
。
标志 | 目的 | 示例 |
---|---|---|
+ | 打印正数和负数的符号 | +3333.33 |
空格 | 在正数之前添加空格 | | 3333.33| |
0 | 数字前面补0 | 003333.33 |
- | 左对齐 | |3333.33 | |
( | 将负数括在括号内 | (3333.33) |
, | 添加分组分隔符 | 3,333.33 |
#(对于f格式) | 包含小数点 | 3,333. |
#(对于x或0格式) | 添加前缀0x或0 | 0xcafe |
$ | 指定要格式化的参数索引。如%1$d %1$x 将以十进制和十六进制格式打印第一个参数 | 159 9F |
< | 格式化前面说明的数值。如%d%<x 将以十进制和十六进制打印同一相数值 | 159 9F |
printf
中还有很多关于日期和时间的转换符,不过这里不建议再使用它们了,而推荐直接使用java.time
包的方法。