process 类 java_编写可执行jar——java的Process类的使用(二)
你知道怎么在控制臺使用ping嗎?那你知道怎么在java中使用ping嗎?
1.批處理文件
批處理文件大家一定不陌生。接觸最多的應(yīng)該就是tomcat中的start.bat或者start.sh了。bat是在windows環(huán)境下運(yùn)行的批處理文件,sh則是linux的shell腳本。
2.adb指令
安卓刷機(jī)的小伙伴們肯定對adb不陌生吧?為了使用adb,我們先安裝一個夜神模擬器。比如我安裝在C:\Program Files\Nox\bin,那么我們先打開cmd,并且cd到C:\Program Files\Nox\bin目錄中。adb指令列表可以看https://www.yeshen.com/faqs/H15tDZ6YW。我們先啟動夜神模擬器。
啟動完成后
我們此時在控制臺輸入adb devices查看啟動的夜神模擬器列表
可以看到已經(jīng)啟動了一個模擬器,占用了62001的端口。
3.Process類
如何在java中執(zhí)行上述的指令呢?java中有一個類叫做Process,用于執(zhí)行shell之類的指令,而且可以獲得控制臺的輸出內(nèi)容。public?class?App?{
public?static?void?main(String...args)throws?Exception{
//執(zhí)行指令
Process?process?=?Runtime.getRuntime().exec("adb?devices");
System.out.println("【控制臺執(zhí)行信息】");
System.out.println(readInputstream(process.getInputStream()));
System.out.println("【控制臺錯誤信息】");
System.out.println(readInputstream(process.getErrorStream()));
}
/**
*?讀取控制臺打印的文字
*?@param?in
*?@return
*?@throws?Exception
*/
public?static?String?readInputstream(InputStream?in)?throws?Exception{
InputStream?inputStream?=?in;
InputStreamReader?inputStreamReader?=?new?InputStreamReader(inputStream);
BufferedReader?bufferedReader?=?new?BufferedReader(inputStreamReader);
StringBuilder?sb?=?new?StringBuilder();
String?line?=?null;
while((line=bufferedReader.readLine())!=null){
sb.append(line).append("\n");
}
return?sb.toString();
}
}
執(zhí)行結(jié)果如下
這是因為在程序入口下找不到adb.exe這個文件。我們只要把【adb】換成【C:\Program Files\Nox\bin\adb】就可以了。
執(zhí)行結(jié)果如下
還有一種執(zhí)行指令的方式就比上述的方式更加簡單了。
下面要講的是ProcessBuilder這個類。我們將main函數(shù)修改成以下樣子public?static?void?main(String...args)throws?Exception{
//執(zhí)行指令
//????????Process?process?=?Runtime.getRuntime().exec("C:\\Program?Files\\Nox\\bin\\adb?devices");
//此處利用ProcessBuilder的command方法,
//值得注意的是command方法支持可變參數(shù),
//也可以使用List,只要按指令空格分開好每個指令項就OK
Process?process?=?new?ProcessBuilder().command("C:\\Program?Files\\Nox\\bin\\adb","devices").start();
System.out.println("【控制臺執(zhí)行信息】");
System.out.println(readInputstream(process.getInputStream()));
System.out.println("【控制臺錯誤信息】");
System.out.println(readInputstream(process.getErrorStream()));
}
執(zhí)行結(jié)果也是一樣的。接下來我們也建一個Builder。
4.編寫指令詞典
可以看到,adb指令實在太多了。作為一個java程序員,是沒必要去記住這些東西的,因為實際上我們并不常用這個東西。所以我們只好建一個指令詞典了。指令詞典的demo如下(我使用了lombok插件,自動生成Getter方法,不知道的同志們,請百度搜一下):package?com.zeemoo.nox.actuator.consts;
import?lombok.Getter;
/**
*?夜神模擬器的adb指令詞典
*
*?@author?zhang.shushan
*?@date?2018/6/8
*/
@Getter
public?class?NoxCmdDict?{
/**
*?adb腳本指令
*/
public?final?static?String?ADB?=?"adb";
/**
*?選擇模擬器
*/
public?final?static?String?SERVER_HOST?=?"-s";
/**
*?模擬器列表
*/
public?final?static?String?DEVICES?=?"devices";
/**
*?安裝apk
*/
public?final?static?String?INSTALL?=?"install";
/**
*?從電腦發(fā)送文件到模擬器,沒什么卵用,還有權(quán)限限制
*/
@Deprecated
public?final?static?String?PUSH?=?"push";
/**
*?從模擬器拉取文件到電腦,沒什么卵用,還有權(quán)限限制
*/
@Deprecated
public?final?static?String?PULL?=?"pull";
/**
*?卸載app
*/
public?final?static?String?UNINSTALL?=?"uninstall";
/**
*?shell腳本指令,安卓內(nèi)核為linux
*/
public?final?static?String?SHELL?=?"shell";
/**
*?列舉進(jìn)程
*/
public?final?static?String?SHELL_PS?=?"ps";
/**
*?包含某個字符串的進(jìn)程信息
*/
public?final?static?String?SHELL_PS_MTH_FIND_STR?="|findStr";
/**
*?包指令
*/
public?final?static?String?SHELL_PM?=?"pm";
/**
*?包指令下的列舉指令
*/
public?final?static?String?SHELL_PM_LIST?=?"list";
/**
*?包指令下的列舉指令選項,表示列舉所有的包名
*/
public?final?static?String?SHELL_PM_LIST_PACKAGES?=?"packages";
/**
*?包指令下的列舉指令選項的附加選項,表示列舉所有的包名和對應(yīng)的路徑
*/
public?final?static?String?SHELL_PM_LIST_PACKAGES_OP_NAME_AND_PATH?=?"-f";
/**
*?獲取某個應(yīng)用的路徑,需要填寫包名
*/
public?final?static?String?SHELL_PM_PATH?=?"path";
/**
*?清除應(yīng)用緩存,后面接包名
*/
public?final?static?String?SHELL_PM_CLEAR_TEMP?=?"clear";
/**
*?應(yīng)用管理指令(Activity?Manager),啟動或關(guān)閉應(yīng)用
*/
public?final?static?String?SHELL_AM?=?"am";
/**
*?啟動應(yīng)用,最后接上包名+“/”+Activity類名
*/
public?final?static?String?SHELL_AM_START?=?"start";
/**
*?這個選項表示如果應(yīng)用啟動了就直接打開后臺進(jìn)程,如果沒啟動則啟動。
*?不加此選項每次調(diào)用start的時候則每次都重啟應(yīng)用
*/
public?final?static?String?SHELL_AM_START_OP_XSTART?=?"-n";
/**
*?關(guān)閉應(yīng)用,后接包名
*/
public?final?static?String?SHELL_AM_STOP?=?"force-stop";
/**
*?殺死進(jìn)程,后接包名,似乎沒什么用
*/
public?final?static?String?SHELL_AM_KILL?=?"kill";
/**
*?殺死后臺所有進(jìn)程,似乎沒什么用
*/
public?final?static?String?SHELL_AM_KILL_ALL?=?"kill-all";
/**
*?shell模擬輸入
*/
public?final?static?String?SHELL_INPUT?=?"input";
/**
*?模擬輸入文字(不支持中文)
*/
public?final?static?String?SHELL_INPUT_TEXT?=?"text";
/**
*?模擬點擊按鍵
*/
public?final?static?String?SHELL_INPUT_KEYEVENT?=?"keyevent";
/**
*?模擬鼠標(biāo)點擊,后面接X,Y
*/
public?final?static?String?SHELL_INPUT_TAP?=?"tap";
/**
*?模擬鼠標(biāo)滑動,后面接X1,Y1,X2,Y2
*/
public?final?static?String?SHELL_INPUT_SWIPE?=?"swipe";
/**
*?截屏
*/
public?final?static?String?SHELL_SCREEN_CAP?=?"screencap";
/**
*?截屏選項,后接截屏文件輸出目標(biāo)
*/
public?final?static?String?SHELL_SCREEN_CAP_OP_DEST?=?"-p";
/**
*?退出shell
*/
public?final?static?String?SHELL_EXIT?=?"exit";
/**
*?夜神模擬器的adb
*/
public?final?static?String?NOX_ADB?=?"nox_adb";
/**
*?夜神模擬器屬性設(shè)置
*/
public?final?static?String?NOX_ADB_SHELL_SET_PROP?=?"setprop";
/**
*?設(shè)置手機(jī)的緯度
*/
public?final?static?String?NOX_ADB_SHELL_SET_PROP_LATITUDE?=?"persist.nox.gps.latitude";
/**
*?設(shè)置模擬器的經(jīng)度
*/
public?final?static?String?NOX_ADB_SHELL_SET_PROP_LONGITUDE?=?"persist.nox.gps.longitude";
/**
*?設(shè)置模擬器的mac地址
*/
public?final?static?String?NOX_ADB_SHELL_SET_PROP_MAC?=?"setprop?persist.nox.wifimac";
}
現(xiàn)在來創(chuàng)建一個Builder類,代碼如下package?com.zeemoo.nox.actuator.service;
import?lombok.AllArgsConstructor;
import?lombok.NoArgsConstructor;
import?lombok.Setter;
import?java.io.File;
import?java.util.ArrayList;
import?java.util.List;
//此處使用靜態(tài)引入指令詞典,可以試著刪去這一行,看看有什么區(qū)別
import?static?com.zeemoo.nox.actuator.consts.NoxCmdDict.*;
/**
*?功能指令構(gòu)建
*
*?@author?zhang.shushan
*?@date?2018/6/8
*/
@Setter
@AllArgsConstructor
@NoArgsConstructor
public?class?NoxCmdBuilder?{
/**
*?夜神模擬器的根目錄
*/
private?String?noxPath;
/**
*?給指令添加指定模擬器
*?@param?cmds
*?@param?host
*?@return
*/
public?List?addHost(List?cmds,String?host){
if(host!=null&&"".equals(host)){
cmds.add(1,?SERVER_HOST);
cmds.add(2,host);
}
return?cmds;
}
/**
*?篩選字符進(jìn)程
*?@param?example
*?@return
*/
public?List?listProcess(String?example){
List?cmds=listPackageName();
cmds.add(SHELL_PS_MTH_FIND_STR);
cmds.add(example);
return?cmds;
}
/**
*?列舉所有的進(jìn)程
*?@return
*/
public?List?listProcess(){
List?cmds?=?this.shellModal();
cmds.add(SHELL_PS);
return?cmds;
}
/**
*?列舉所有模擬器
*?@return
*/
public?List?devices(){
List?cmds?=?new?ArrayList<>();
cmds.add(noxPath+File.separator+?NOX_ADB);
cmds.add(DEVICES);
return?cmds;
}
/**
*?啟動夜神模擬器
*?@return
*/
public?String?startNox(){
return?noxPath+File.separator+"nox.exe";
}
/**
*?截屏
*?@param?vitualBoxFilePath
*?@return
*/
public?List?screenCap(String?vitualBoxFilePath){
List?cmds?=?new?ArrayList<>();
cmds.add(SHELL_SCREEN_CAP);
cmds.add(SHELL_SCREEN_CAP_OP_DEST);
cmds.add(vitualBoxFilePath);
return?cmds;
}
/**
*?模擬滑動屏幕
*?@param?x1
*?@param?y1
*?@param?x2
*?@param?y2
*?@return
*/
public?List?swipe(int?x1,int?y1,int?x2,int?y2){
List?cmds?=?this.inputModal();
cmds.add(SHELL_INPUT_SWIPE);
cmds.add(String.valueOf(x1));
cmds.add(String.valueOf(y1));
cmds.add(String.valueOf(x2));
cmds.add(String.valueOf(y2));
return?cmds;
}
/**
*?模擬點擊
*?@param?x
*?@param?y
*?@return
*/
public?List?click(int?x,int?y){
List?cmds?=?this.inputModal();
cmds.add(SHELL_INPUT_TAP);
cmds.add(String.valueOf(x));
cmds.add(String.valueOf(y));
return?cmds;
}
/**
*?模擬按鍵
*?@param?keys?按鍵
*?@return
*/
public?List?pressKey(List?keys){
List?cmds?=?this.inputModal();
cmds.add(SHELL_INPUT_KEYEVENT);
cmds.addAll(keys);
return?cmds;
}
/**
*?文本輸入,不支持中文
*?@param?text
*?@return
*/
public?List?inputText(String?text){
List?cmds?=?this.inputModal();
cmds.add(SHELL_INPUT_TEXT);
cmds.add(text);
return?cmds;
}
/**
*?輸入模式
*?@return
*/
private?List?inputModal()?{
List?cmds?=?this.shellModal();
cmds.add(SHELL_INPUT);
return?cmds;
}
/**
*?殺死后臺所有進(jìn)程
*?@return
*/
public?List?killAllAppProcess(){
List?cmds?=?this.activityManager();
cmds.add(SHELL_AM_KILL_ALL);
return?cmds;
}
/**
*?殺死某個后臺進(jìn)程
*?@param?pkgNm
*?@return
*/
public?List?killAppProcess(String?pkgNm){
List?cmds?=?this.activityManager();
cmds.add(SHELL_AM_KILL);
cmds.add(pkgNm);
return?cmds;
}
/**
*?停止app
*?@param?pkgName
*?@return
*/
public?List?stopApp(String?pkgName){
List?cmds?=?this.activityManager();
cmds.add(SHELL_AM_STOP);
cmds.add(pkgName);
return?cmds;
}
/**
*?啟動app
*?@param?pkgName
*?@param?activity
*?@return
*/
public?List?startApp(String?pkgName,String?activity){
List?cmds?=?this.activityManager();
cmds.add(SHELL_AM_START);
cmds.add(SHELL_AM_START_OP_XSTART);
cmds.add(pkgName+"/"+activity);
return?cmds;
}
/**
*?獲取某個應(yīng)用的路徑
*?@param?pkgName
*?@return
*/
public?List?getAppPath(String?pkgName){
List?cmds?=?this.packageManager();
cmds.add(SHELL_PM_PATH);
cmds.add(pkgName);
return?cmds;
}
/**
*
*?@return
*/
public?List?listPackageNameAndPath(){
List?cmds?=?this.listPackageName();
cmds.add(SHELL_PM_LIST_PACKAGES_OP_NAME_AND_PATH);
return?cmds;
}
/**
*?列舉所有的包名
*?@return
*/
public?List?listPackageName(){
List?cmds=this.packageManager();
cmds.add(SHELL_PM_LIST);
cmds.add(SHELL_PM_LIST_PACKAGES);
return?cmds;
}
/**
*?包操作指令
*?@return
*/
private?List?packageManager(){
List?cmds?=?this.shellModal();
cmds.add(SHELL_PM);
return?cmds;
}
/**
*?activityManager模式
*?@return
*/
private?List?activityManager(){
List?cmds?=?this.shellModal();
cmds.add(SHELL_AM);
return?cmds;
}
/**
*?從模擬器拉取文件到電腦,有權(quán)限限制
*?@param?virtualBoxFilePath
*?@param?pcFilePath
*?@return
*/
@Deprecated
public?List?pull(String?virtualBoxFilePath,String?pcFilePath){
List?cmds?=?new?ArrayList<>();
cmds.add(noxPath+File.separator+virtualBoxFilePath);
cmds.add(PULL);
cmds.add(virtualBoxFilePath);
cmds.add(pcFilePath);
return?cmds;
}
/**
*?推送文件到模擬器,有權(quán)限限制
*?@param?pcFilePath
*?@param?vitualBoxFilePath
*?@return
*/
@Deprecated
public?List?push(String?pcFilePath,String?vitualBoxFilePath){
List?cmds?=?new?ArrayList<>();
cmds.add(noxPath+?File.separator+?NOX_ADB);
cmds.add(PUSH);
cmds.add(pcFilePath);
cmds.add(vitualBoxFilePath);
return?cmds;
}
/**
*?卸載app
*?@param?packageName
*?@return
*/
public?List?uninstall(String?packageName){
List?cmds?=?new?ArrayList<>();
cmds.add(noxPath+?File.separator+?NOX_ADB);
cmds.add(UNINSTALL);
cmds.add(packageName);
return?cmds;
}
/**
*?安裝app
*?@param?apkPath
*?@return
*/
public?List?install(String?apkPath){
List?cmds?=?new?ArrayList<>();
cmds.add(noxPath+?File.separator+?NOX_ADB);
cmds.add(INSTALL);
cmds.add(apkPath);
return?cmds;
}
/**
*?設(shè)置mac地址
*?@param?mac
*?@return
*/
public?List?setMac(String?mac){
List?cmds?=?this.shellModal();
cmds.add(NOX_ADB_SHELL_SET_PROP);
cmds.add(NOX_ADB_SHELL_SET_PROP_MAC);
cmds.add(mac);
return?cmds;
}
/**
*?設(shè)置經(jīng)度
*?@param?longitude
*?@return
*/
public?List?setLongitude(Double?longitude){
List?cmds?=?this.shellModal();
cmds.add(NOX_ADB_SHELL_SET_PROP);
cmds.add(NOX_ADB_SHELL_SET_PROP_LONGITUDE);
cmds.add(longitude.toString());
return?cmds;
}
/**
*?設(shè)置模擬器緯度
*?@param?latitude
*?@return
*/
public?List?setLatitude(Double?latitude){
List?cmds?=?this.shellModal();
cmds.add(NOX_ADB_SHELL_SET_PROP);
cmds.add(NOX_ADB_SHELL_SET_PROP_LATITUDE);
cmds.add(latitude.toString());
return?cmds;
}
/**
*?shell模式,設(shè)置模擬器屬性之類的
*?@return
*/
private?List?shellModal(){
List?cmds?=?new?ArrayList<>();
cmds.add(noxPath+?File.separator+?NOX_ADB);
cmds.add(SHELL);
return?cmds;
}
/**
*?shell模式,清除緩存
*?@return
*/
public?List?clearTemp(String?pckName)?{
List?cmds?=?this.shellModal();
cmds.add(SHELL_PM_CLEAR_TEMP);
cmds.add(pckName);
return?cmds;
}
}
我們來測試一下。修改main方法如下:public?static?void?main(String...args)throws?Exception{
NoxCmdBuilder?noxCmdBuilder?=?new?NoxCmdBuilder("C:\\Program?Files\\Nox\\bin");
System.out.println(noxCmdBuilder.listPackageName());
}
輸出結(jié)果[C:\Program?Files\Nox\bin\nox_adb,?shell,?pm,?list,?packages]
直接將這個list放入ProcessBuilder中使用,就可以獲得所有的包名了。我們來試一下。修改main如下public?static?void?main(String...?args)?throws?Exception?{
NoxCmdBuilder?noxCmdBuilder?=?new?NoxCmdBuilder("C:\\Program?Files\\Nox\\bin");
Process?start?=?new?ProcessBuilder().command(noxCmdBuilder.listPackageName()).start();
//此處注意的是,讀取流信息的時候,有可能流對象太大,
//不能一次性讀完,導(dǎo)致獲取的字符串順序錯亂或缺失的問題,
//所以我們等程序執(zhí)行完畢之后再去讀取
//waitFor會讓線程阻塞,直至process執(zhí)行完畢
start.waitFor();
System.out.println(readInputstream(start.getInputStream()));
}
總結(jié)
以上是生活随笔為你收集整理的process 类 java_编写可执行jar——java的Process类的使用(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux vi 行尾 ctrl,lin
- 下一篇: linux用户命令快捷链接,linux简