Java 9 新特性之模块化和进程API

来源:互联网 发布:ubuntu u盘 编辑:程序博客网 时间:2024/05/18 01:07

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();    }  }
原创粉丝点击