Java 9 新特性:https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23AFD78-C777-460B-8ACE-58BE5EA681F6
1. Java Platform Module System 模块化系统
模块化系统是Java 9 最大的一个特性,模块之间存在相互的依赖关系,可以导出一个公共的API,并且隐藏实现的细节,使用Java 9的模块化可以减少内存的开销。在JVM启动的时候,整个rt.jar都会被JVM加载到内存当中去,模块化可以根据模块的需要加载程序运行需要的class, 如下,通过requires关键字可以引入依赖的模块,通过exports关键字可以导出包。
module com.baeldung.java9.modules.car {
requires com.baeldung.java9.modules.engines;
exports com.baeldung.java9.modules.car.handling;
}
2. Process API Updates 进程API
2.1 创建进程
通过创建进程可以运行shell命令,通过ProcessBuilder类可以创建一个线程,如下:
public static void setEnvTest() throws IOException, InterruptedException {
ProcessBuilder pb =
new ProcessBuilder("/bin/sh", "-c", "echo $horse $dog $HOME").inheritIO();
pb.environment().put("horse", "oats");//绑定运行参数
pb.environment().put("dog", "treats");
//通过start方法可以获得一个proccess实例,waitFor方法等待进程运行结束
pb.start().waitFor();
}
2.2 获取进程信息
通过pid 方法可以获取进程的PID,info方法会返回一个ProcessHandle.Info实例,其中包含开始时间和用户信息
public static void getInfoTest() throws IOException {
ProcessBuilder pb = new ProcessBuilder("echo", "Hello World!");
String na = "<not available>";
Process p = pb.start();
ProcessHandle.Info info = p.info();
System.out.printf("Process ID: %s%n", p.pid());
System.out.printf("Command name: %s%n", info.command().orElse(na));
System.out.printf("Command line: %s%n", info.commandLine().orElse(na));
System.out.printf("Start time: %s%n",
info.startInstant().map(i -> i.atZone(ZoneId.systemDefault())
.toLocalDateTime().toString())
.orElse(na));
System.out.printf("Arguments: %s%n",
info.arguments().map(a -> Stream.of(a)
.collect(Collectors.joining(" ")))
.orElse(na));
System.out.printf("User: %s%n", info.user().orElse(na));
}
2.3 重定向进程输出
Process.getOutputStream 和Process.getErrorStream方法可以获取进程的输出流,此外通过 redirectOutput 和 redirectError可以在进程运行前将进程输出到文件中
public static void redirectToFileTest() throws IOException, InterruptedException {
File outFile = new File("out.tmp");
Process p = new ProcessBuilder("ls", "-la")
.redirectOutput(outFile)
.redirectError(Redirect.INHERIT)
.start();
int status = p.waitFor();
if (status == 0) {
p = new ProcessBuilder("cat" , outFile.toString())
.inheritIO()
.start();
p.waitFor();
}
}