java执行本地命令需要在命令执行时传入参数,怎么办?

zfq642773391 2010-08-22 10:06:54
java的runtime.exec可以执行本地命令,如Runtime.exec("fdisk -l");
现在执行本地命令,如给磁盘分区,需要在命令执行过程中输入分区参数来完成这个命令,
但是怎么给这个命令输入参数呢
谁做过这方面的 ,给个解决方法
谢谢了
...全文
941 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Inhibitory 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zfq642773391 的回复:]

引用 10 楼 inhibitory 的回复:
再说明一下,编译好Test.java和Terminal.java后,执行java Terminal,然后就会提示开始进行输入了。
Test.java不要去执行,因为它会被Terminal.java去调用执行,然后输入是在Test.java中要求的,而Terminal.java只是接管了Test.java中的输入输出请求。

可以把Test.……
[/Quote]
这个程序只是帮你运行另一个程序,捕捉的是另一个程序的输入输出,如果你想要得到那个程序的安装进度,必须是那个程序把安装进度输出,然后这个程序里才能显示出来。
zhangfaqi 2010-08-24
  • 打赏
  • 举报
回复
不明白 ,帮顶
zfq642773391 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 inhibitory 的回复:]
再说明一下,编译好Test.java和Terminal.java后,执行java Terminal,然后就会提示开始进行输入了。
Test.java不要去执行,因为它会被Terminal.java去调用执行,然后输入是在Test.java中要求的,而Terminal.java只是接管了Test.java中的输入输出请求。

可以把Test.java修改为如下,可以多进行几次输入:

Ja……
[/Quote]
补充问一下,如果执行的命令在完成时是有进度的,比如linux下的在线安装,命令执行后有安装的进度
那怎么在java端也反映出这种进度呢
zfq642773391 2010-08-23
  • 打赏
  • 举报
回复
补充问一下,如果执行的命令在完成时是有进度的,比如linux下的在线安装,命令执行后有安装的进度
那怎么在java端也反映出这种进度呢
zfq642773391 2010-08-23
  • 打赏
  • 举报
回复
补充问一下,如果执行的命令在完成时是有进度的,比如linux下的在线安装,命令执行后有安装的进度
那怎么在java端也反映出这种进度呢
dr_lou 2010-08-22
  • 打赏
  • 举报
回复
sorry 说错了,不需要。

package com.xuz.csdn.aug22;

import java.io.IOException;
import java.io.InputStream;

public class RuntimeTest {

public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("netstat -an");
InputStream is = process.getInputStream();
byte[] b = new byte[1024];
int size;
while((size = is.read(b)) != -1)
System.out.println(new String(b,0,size,"GBK"));
} catch (IOException e) {
e.printStackTrace();
}
}

}
dr_lou 2010-08-22
  • 打赏
  • 举报
回复
我记得这个函数可以传入String[]吧
super_stan 2010-08-22
  • 打赏
  • 举报
回复
没明白
Inhibitory 2010-08-22
  • 打赏
  • 举报
回复
再说明一下,编译好Test.java和Terminal.java后,执行java Terminal,然后就会提示开始进行输入了。
Test.java不要去执行,因为它会被Terminal.java去调用执行,然后输入是在Test.java中要求的,而Terminal.java只是接管了Test.java中的输入输出请求。

可以把Test.java修改为如下,可以多进行几次输入:
import java.util.Scanner;

public class Test {
public static void main(String[] args) {
System.out.println("Hi, Console");
System.out.println("Go, Console");

System.out.println("Please input ...");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
System.out.println("Your input is: " + str);
str = scanner.nextLine();
System.out.println("Your input is: " + str);
str = scanner.nextLine();
System.out.println("Your input is: " + str);
}
}
Inhibitory 2010-08-22
  • 打赏
  • 举报
回复
下面是很久以前写的模拟Eclipse的命令行的程序,也许对你有些帮助。
///////////////////////////////////////////////////////////////////////////////
// 类Test是用来测试的,即一个进程,它要求在控制台进行输入输出, 类Terminal模拟了Eclipse的控制台.
///////////////////////////////////////////////////////////////////////////////
import java.util.Scanner;

public class Test {
public static void main(String[] args) {
System.out.println("Hi, Console");
System.out.println("Go, Console");

System.out.println("Please input ...");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
System.out.println("Your input is: " + str);
}
}

///////////////////////////////////////////////////////////////////////////////
// 在类Terminal中有三个线程,一个用于监听proc正常的输出,一个监听proc的错误输出,一个用于
// 监听用户输入到控制台的数据,然后把这个数据输出到proc里(对于proc来说是输入)
///////////////////////////////////////////////////////////////////////////////
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class Terminal {

public static void main(String[] args) throws IOException, InterruptedException {
final Process proc = Runtime.getRuntime().exec("java Test");

// Normal input thread
new Thread() {
public void run() {
InputStream in = proc.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

try {
int ch = 0;
while ((ch = reader.read()) != -1) { // 不用readLine是为了防止print没有回车的输出
System.out.print((char) (ch));
}

System.out.println("Process end.");
// 当读取到-1时,说明proc已经结束,所以本程序也应该结束了(或者结束输出线程)
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();

// Error input thread
new Thread() {
public void run() {
InputStream in = proc.getErrorStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = null;

try {
while ((line = reader.readLine()) != null) {
System.err.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();

// System.out.println("Sleep...");
// Thread.sleep(3000); // 程序在这里等待时,在Eclipse的控制台也能进行输入
// 当proc代表的程序结束后,Eclipse才强制在控制台不能进行输入

// Output thread.
// 在输入中按下回车后取得当前行字符(去掉传进来的,只取输入的部分),然后转对方.
new Thread() {
public void run() {
OutputStream out = proc.getOutputStream();
PrintWriter writer = new PrintWriter(out);
Scanner scanner = new Scanner(System.in);
String str = null;
while ((str = scanner.nextLine()) != null) {
writer.println(str);
writer.flush();
}
}
}.start();
}
}

///////////////////////////////////////////////////////////////////////////////
// 执行方法:
///////////////////////////////////////////////////////////////////////////////
1. 先编译好这两个文件放在同一个文件夹里
2. 在终端里执行: java Terminal
3. 看终端里的提示进行操作
huntor 2010-08-22
  • 打赏
  • 举报
回复
向 process.getOutputStream 写
看这个连接http://blog.csdn.net/Sammy_chan/archive/2007/09/09/1778064.aspx
zfq642773391 2010-08-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 inhibitory 的回复:]
作为main函数的参数进去,自己再解析一下就可以了。
[/Quote]
参数是可以传进去
比如我们执行命令 执行到一半要输入y或者n
但在java中,只能执行一句命令,在命令过程中需要输入的参数,怎样解析呢

Inhibitory 2010-08-22
  • 打赏
  • 举报
回复
作为main函数的参数进去,自己再解析一下就可以了。
zfq642773391 2010-08-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 inhibitory 的回复:]
Java code
/*
* Test3.java
*
* Created on 2007-9-27, 11:46:31
*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package test2;

impor……
[/Quote]
那我怎么在命令执行过程中输入命令所需的参数呢
Inhibitory 2010-08-22
  • 打赏
  • 举报
回复
/*
* Test3.java
*
* Created on 2007-9-27, 11:46:31
*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package test2;

import java.io.File;
import java.io.IOException;
import java.util.Map;

/**
*
* @author hadeslee
*/
public class Test3 {
public static void restart() throws IOException{
//用一条指定的命令去构造一个进程生成器
ProcessBuilder pb=new ProcessBuilder("java","-jar","Test3.jar");
//让这个进程的工作区空间改为F:\dist
//这样的话,它就会去F:\dist目录下找Test.jar这个文件
pb.directory(new File("F:\\dist"));
//得到进程生成器的环境 变量,这个变量我们可以改,
//改了以后也会反应到新起的进程里面去
Map<String,String> map=pb.environment();
Process p=pb.start();
//然后就可以对p做自己想做的事情了
//自己这个时候就可以退出了
System.exit(0);
}
}

在这里我们利用了ProcessBuilder这个类,这个类是一个进程的生成类,我们在起动一个进程之前可以设置好相关的一些参数,比如工作目录,环境变量等等,但是设置环境变的时候,有一个需要注意的地方就是你设置的环境变量不会改变系统原来的环境变量.也就是说即使你把path设为空,这个进程的运行的时候,依然是读取系统的path找到java这个命令,否则的话,你把path设为空,java命令是不可能找得到的.
zfq642773391 2010-08-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dr_lou 的回复:]
sorry 说错了,不需要。


Java code
package com.xuz.csdn.aug22;

import java.io.IOException;
import java.io.InputStream;

public class RuntimeTest {

public static void main(String[] args) {
……
[/Quote]
你这只是取回命令的返回信息
但我的问题是这样的
我用runtime.exec执行一个命令
这个命令比如是command -m

命令执行时返回了一些信息:
xxxxxxxxxxxxx
please enter a argument:
在执行时要输入一个参数,然后这个命令才会继续执行,
这时java中该怎么来设置这个参数呢
java中好像只能在运行程序之初设置命令参数
在命令执行时怎么设置这个参数呢

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧