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

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();
    }
  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值