日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

process 类 java_编写可执行jar——java的Process类的使用(二)

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 process 类 java_编写可执行jar——java的Process类的使用(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

你知道怎么在控制臺使用ping嗎?那你知道怎么在java中使用ping嗎?

1.批處理文件

批處理文件大家一定不陌生。接觸最多的應該就是tomcat中的start.bat或者start.sh了。bat是在windows環境下運行的批處理文件,sh則是linux的shell腳本。

2.adb指令

安卓刷機的小伙伴們肯定對adb不陌生吧?為了使用adb,我們先安裝一個夜神模擬器。比如我安裝在C:\Program Files\Nox\bin,那么我們先打開cmd,并且cd到C:\Program Files\Nox\bin目錄中。adb指令列表可以看https://www.yeshen.com/faqs/H15tDZ6YW。我們先啟動夜神模擬器。

啟動完成后

我們此時在控制臺輸入adb devices查看啟動的夜神模擬器列表

可以看到已經啟動了一個模擬器,占用了62001的端口。

3.Process類

如何在java中執行上述的指令呢?java中有一個類叫做Process,用于執行shell之類的指令,而且可以獲得控制臺的輸出內容。public?class?App?{

public?static?void?main(String...args)throws?Exception{

//執行指令

Process?process?=?Runtime.getRuntime().exec("adb?devices");

System.out.println("【控制臺執行信息】");

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();

}

}

執行結果如下

這是因為在程序入口下找不到adb.exe這個文件。我們只要把【adb】換成【C:\Program Files\Nox\bin\adb】就可以了。

執行結果如下

還有一種執行指令的方式就比上述的方式更加簡單了。

下面要講的是ProcessBuilder這個類。我們將main函數修改成以下樣子public?static?void?main(String...args)throws?Exception{

//執行指令

//????????Process?process?=?Runtime.getRuntime().exec("C:\\Program?Files\\Nox\\bin\\adb?devices");

//此處利用ProcessBuilder的command方法,

//值得注意的是command方法支持可變參數,

//也可以使用List,只要按指令空格分開好每個指令項就OK

Process?process?=?new?ProcessBuilder().command("C:\\Program?Files\\Nox\\bin\\adb","devices").start();

System.out.println("【控制臺執行信息】");

System.out.println(readInputstream(process.getInputStream()));

System.out.println("【控制臺錯誤信息】");

System.out.println(readInputstream(process.getErrorStream()));

}

執行結果也是一樣的。接下來我們也建一個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";

/**

*?從電腦發送文件到模擬器,沒什么卵用,還有權限限制

*/

@Deprecated

public?final?static?String?PUSH?=?"push";

/**

*?從模擬器拉取文件到電腦,沒什么卵用,還有權限限制

*/

@Deprecated

public?final?static?String?PULL?=?"pull";

/**

*?卸載app

*/

public?final?static?String?UNINSTALL?=?"uninstall";

/**

*?shell腳本指令,安卓內核為linux

*/

public?final?static?String?SHELL?=?"shell";

/**

*?列舉進程

*/

public?final?static?String?SHELL_PS?=?"ps";

/**

*?包含某個字符串的進程信息

*/

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";

/**

*?包指令下的列舉指令選項的附加選項,表示列舉所有的包名和對應的路徑

*/

public?final?static?String?SHELL_PM_LIST_PACKAGES_OP_NAME_AND_PATH?=?"-f";

/**

*?獲取某個應用的路徑,需要填寫包名

*/

public?final?static?String?SHELL_PM_PATH?=?"path";

/**

*?清除應用緩存,后面接包名

*/

public?final?static?String?SHELL_PM_CLEAR_TEMP?=?"clear";

/**

*?應用管理指令(Activity?Manager),啟動或關閉應用

*/

public?final?static?String?SHELL_AM?=?"am";

/**

*?啟動應用,最后接上包名+“/”+Activity類名

*/

public?final?static?String?SHELL_AM_START?=?"start";

/**

*?這個選項表示如果應用啟動了就直接打開后臺進程,如果沒啟動則啟動。

*?不加此選項每次調用start的時候則每次都重啟應用

*/

public?final?static?String?SHELL_AM_START_OP_XSTART?=?"-n";

/**

*?關閉應用,后接包名

*/

public?final?static?String?SHELL_AM_STOP?=?"force-stop";

/**

*?殺死進程,后接包名,似乎沒什么用

*/

public?final?static?String?SHELL_AM_KILL?=?"kill";

/**

*?殺死后臺所有進程,似乎沒什么用

*/

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";

/**

*?模擬鼠標點擊,后面接X,Y

*/

public?final?static?String?SHELL_INPUT_TAP?=?"tap";

/**

*?模擬鼠標滑動,后面接X1,Y1,X2,Y2

*/

public?final?static?String?SHELL_INPUT_SWIPE?=?"swipe";

/**

*?截屏

*/

public?final?static?String?SHELL_SCREEN_CAP?=?"screencap";

/**

*?截屏選項,后接截屏文件輸出目標

*/

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";

/**

*?夜神模擬器屬性設置

*/

public?final?static?String?NOX_ADB_SHELL_SET_PROP?=?"setprop";

/**

*?設置手機的緯度

*/

public?final?static?String?NOX_ADB_SHELL_SET_PROP_LATITUDE?=?"persist.nox.gps.latitude";

/**

*?設置模擬器的經度

*/

public?final?static?String?NOX_ADB_SHELL_SET_PROP_LONGITUDE?=?"persist.nox.gps.longitude";

/**

*?設置模擬器的mac地址

*/

public?final?static?String?NOX_ADB_SHELL_SET_PROP_MAC?=?"setprop?persist.nox.wifimac";

}

現在來創建一個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;

//此處使用靜態引入指令詞典,可以試著刪去這一行,看看有什么區別

import?static?com.zeemoo.nox.actuator.consts.NoxCmdDict.*;

/**

*?功能指令構建

*

*?@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;

}

/**

*?篩選字符進程

*?@param?example

*?@return

*/

public?List?listProcess(String?example){

List?cmds=listPackageName();

cmds.add(SHELL_PS_MTH_FIND_STR);

cmds.add(example);

return?cmds;

}

/**

*?列舉所有的進程

*?@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;

}

/**

*?殺死后臺所有進程

*?@return

*/

public?List?killAllAppProcess(){

List?cmds?=?this.activityManager();

cmds.add(SHELL_AM_KILL_ALL);

return?cmds;

}

/**

*?殺死某個后臺進程

*?@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;

}

/**

*?獲取某個應用的路徑

*?@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;

}

/**

*?從模擬器拉取文件到電腦,有權限限制

*?@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;

}

/**

*?推送文件到模擬器,有權限限制

*?@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;

}

/**

*?設置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;

}

/**

*?設置經度

*?@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;

}

/**

*?設置模擬器緯度

*?@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模式,設置模擬器屬性之類的

*?@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());

}

輸出結果[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();

//此處注意的是,讀取流信息的時候,有可能流對象太大,

//不能一次性讀完,導致獲取的字符串順序錯亂或缺失的問題,

//所以我們等程序執行完畢之后再去讀取

//waitFor會讓線程阻塞,直至process執行完畢

start.waitFor();

System.out.println(readInputstream(start.getInputStream()));

}

總結

以上是生活随笔為你收集整理的process 类 java_编写可执行jar——java的Process类的使用(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。