import java.io.*;
public class chk
{
String className;
String command,command1,command2;
public String getMsg(String fileName,String Path)
{
String dir;
command1="cd "+Path;
dir=Path.charAt(0)+Path.charAt(1)+"";
command2=dir;
command = "javac " + fileName;
String a=executeCommand(command1);
a=executeCommand(command2);
String output = executeCommand(command);
if(output.compareTo("")==0)
output = "Compilation Successfull!!";
return output;
}
private String executeCommand(String command)
{
StringBuffer output = new StringBuffer();
Process p;
try
{
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader1 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
BufferedReader reader2 = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader1.readLine())!= null)
{
output.append(line + "\n");
}
while ((line = reader2.readLine())!= null)
{
output.append(line + "\n");
}
} catch (Exception e)
{
e.printStackTrace();
}
return output.toString();
}
public static void main(String args[])throws IOException
{
String x;
chk ob=new chk();
x=ob.getMsg("MyClass.java","D:\test");
System.out.println("OUtput : "+x);
}
}
错误
我试图在java文件的帮助下在命令提示符下运行一堆命令,以便稍后我可以编译另一个名为“MyClass.java”的java文件,该文件存在于我的计算机中的其他驱动器中,但我是得到以下错误,说明它甚至无法执行我的第一个命令,即“command1 =”cd“+ Path;”这条线。请帮助!
答案 0 :(得分:3)
cd
不是Windows上的程序。如果打开命令提示符窗口,则会运行一个程序cmd.exe
,用于输入和处理命令。许多命令将导致程序被执行,但某些命令由cmd.exe
本身解释,包括cd
命令。 cd
命令将在命令提示符窗口中设置一些状态,这将影响同一cmd.exe
处理未来命令的方式。因此,您不仅可以将cd
作为程序运行,还无法运行cmd.exe
并使用它来处理cd
命令。您可以,但它对您没有任何好处,因为cd
命令只会影响cmd.exe
进程内部的内容,然后cmd.exe
将终止。
您可能希望查看ProcessBuilder
,它有一个方法directory
来设置进程的工作目录。 (我对这门课程并不熟悉,所以我不能给你任何具体的例子。但看起来它确实是你所需要的。)
编辑:进一步调查后:您正在使用exec
Runtime
方法。 exec
方法有一个版本,它将工作目录作为参数:
public Process exec(String command,
String[] envp,
File dir)
因此,如果您将null
与envp
一起使用(假设您不想创建一组新的环境变量),并设置File
来引用工作目录,我想这会给你你想要的。所以你可以用这种方式做事,而不是使用ProcessBuilder
。
更多:对于像
这样的命令java zzzzzz < C:\iptest\input.txt > C:\outtest\name.txt
在命令提示符窗口中键入此命令时,cmd.exe
程序会解释<
和>
命令以重定向输入和输出,并负责所需的操作。它们不会在exec()
执行的命令中工作,因为它们只会被视为命令行参数。 exec
Runtime
方法没有设置重定向输入和输出文件的机制,但ProcessBuilder
确实如此。请参阅javadoc。我对ProcessBuilder
没有太多经验,但看起来你需要创建一个ProcessBuilder
对象,使用command
来设置命令和参数(作为单独的字符串,而不是一个包含空格字符的长字符串),使用directory
设置工作目录,使用redirectInput
和redirectOutput
设置重定向文件,然后start()
。