博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 调用process
阅读量:5978 次
发布时间:2019-06-20

本文共 4094 字,大约阅读时间需要 13 分钟。

java调用process 有两种实现方法,一是使用Runtime类,二是使用Process类。

我在最近的项目里用的是Runtime类,接下来写下总结。

 

有图有真相(在网上学来一句话)

 
1 package com.lee.demo; 2  3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7  8 public class RuntimeDemo01 { 9 10     public static void main(String[] args) {11         String s;12         StringBuilder sb = new StringBuilder();13         InputStream fis = null;14         try {15             // Process process = Runtime.getRuntime().exec("ping localhost");                Process process = Runtime.getRuntime().exec(new String[]{"sh", "-c", XXXX});                // 注意,我将原来的15行注释掉了,变成了下面的写法。声明,我调用的command是Lunix下的命令,如果你用的是windows的话,不需要这么写。                // 为什么要使用这样的写法,因为项目需要考虑到单引号双引号等,转换加/的原因。16             fis = process.getInputStream();17             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fis)); 18             while((s=bufferedReader.readLine()) != null) {19                 sb.append(s);                    //sb.append(\n);20             }21             System.out.println(sb.toString());22             process.waitFor();23             System.out.println(process.exitValue());24         } catch (InterruptedException e) {25             e.printStackTrace();26         } catch (IOException e) {27             e.printStackTrace();28         } finally {29             try {30                 fis.close();31             } catch (IOException e) {32                 e.printStackTrace();33             }34         }35     }36 }

执行结果如下

使用法: ping [-t] [-a] [-n 要求数] [-l サイズ] [-f] [-i TTL] [-v TOS]            [-r ホップ数] [-s ホップ数] [[-j ホスト一覧] | [-k ホスト一覧]]            [-w タイムアウト] [-R] [-S ソースアドレス] [-4] [-6] ターゲット名オプション:    -t             中断されるまで、指定されたホストを Ping します。                   統計を表示して続行するには、Ctrl+Break を押してください。                   停止するには、Ctrl+C を押してください。    -a             アドレスをホスト名に解決します。    -n 要求数      送信するエコー要求の数です。    -l サイズ      送信バッファーのサイズです。    -f             パケット内の Don't Fragment フラグを設定します (IPv4 のみ)。    -i TTL         Time To Live です。    -v TOS         Type Of Service (IPv4 のみ。この設定はもう使用されておらず、                   IP ヘッダー内のサービス フィールドの種類に影響しません)。    -r ホップ数    指定したホップ数のルートを記録します (IPv4 のみ)。    -s ホップ数    指定したホップ数のタイムスタンプを表示します (IPv4 のみ)。    -j ホスト一覧  一覧で指定された緩やかなソース ルートを使用します                   (IPv4 のみ)。    -k ホスト一覧  一覧で指定された厳密なソース ルートを使用します                   (IPv4 のみ)。    -w タイムアウト                   応答を待つタイムアウトの時間 (ミリ秒) です。    -R             ルーティング ヘッダーを使用して逆ルートもテストします                   (IPv6 のみ)。    -S ソースアドレス                   使用するソース アドレスです。    -4             IPv4 の使用を強制します。    -6             IPv6 の使用を強制します。

如果你执行的命令是 ping localhost的话,那么是可以正常执行并返回黑屏下一样的结果的。

在这里说一下我遇到的几个坑。

首先,lunix下执行和windows下执行不一样。比如上面的例子中,ping这个命令,没有添加参数时,在执行结果中会打出黑屏下一样的提示信息,但是lunix下不行,在程序中需要process.getErrorStream(),这样才能得到一致的结果。

第二个坑,是要记得添加process.waitFor();这行代码,代码的意思是 线程一直到process结束再往下执行。如果不写这行代码,那么process执行的同时,线程在往下执行,到后面23行的代码会抛出error。此外,process.waitFor()代码要放在,对输入流的操作之后,因为每次输入流读取的大小是有限制的,如果超过最大值,而输入流中的内容没有被读取,那么久会发生阻塞,到时程序一直停在那里。

第三个坑,在上文中代码的第17行里,使用了匿名类的new InputStreamReader,在性能测试的时候,报错,can not open too many files,原因是InputStreamReader使用了之后,最后没有将他close。一定要在finally中将它close掉。

第四个坑,代码第18行,readLine()方法,大家很熟悉。我们看一下API中的定义。

public String readLine()                throws IOExceptionReads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.Returns:    A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reachedThrows:    IOException - If an I/O error occurs

 在returns中,明确写明,只返回内容,不会返回换行符号等。这就导致最后我们取得的内容是一行String,很长。我决定在19行后,加个换行符,这样就可以换行了。

 

接下来,简单说明一下Process类,要说的是,自jdk1.5起,官方建议,使用来启动process

官方文档地址: https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html

其实JDK中Runtime最终调用的是processbuilder。

processbuilder提供的功能更加丰富,可以设置工作目录,环境变量等。

推荐一篇文章,processBuilder介绍得很好。

http://www.cnblogs.com/taven/archive/2011/12/17/2291460.html

 

转载于:https://www.cnblogs.com/lihao007/p/7192925.html

你可能感兴趣的文章
@EnableTransactionManagement注解理解
查看>>
vue前后分离动态路由和权限管理方案
查看>>
《JavaScript高级程序设计》读书笔记(十):本地对象Date
查看>>
linux中fork()函数详解
查看>>
从1G到5G,46年屏幕变迁下,富士康、苹果、三星、华为的浴火重生路 ...
查看>>
Flutter下实现低延迟的跨平台RTSP/RTMP播放
查看>>
大牛直播跨平台RTSP/RTMP转RTMP转发SDK
查看>>
Cloud Toolkit 上传文件到远程服务器
查看>>
如何优雅拒绝产品经理的不合理需求
查看>>
计算机网络参考模型
查看>>
CVPR论文 | 如何处理多种退化类型的卷积超分辨率?
查看>>
python基础教程第二版 7 更加抽象:类
查看>>
Nacos简介及使用
查看>>
怡亚通星链获超1亿元Pre-A轮融资,投资方为中融国际信托
查看>>
时代汹涌,高亚科技如何携8Manage稳站风口?
查看>>
基于Apollo实现.NET Core微服务统一配置(测试环境-单机)
查看>>
Windows中常用文件拷贝工具的评测和对比
查看>>
华为一季度手机发货量超5900万台,折叠屏手机或延期
查看>>
苹果痛下狠手,全面禁止App内部的广告拦截软件
查看>>
百胜软件黄飞:携手阿里云,用双中台驱动新零售
查看>>