【发布时间】:2013-11-12 06:42:25
【问题描述】:
我基本上是在制作一个 shell 来玩玩向命令提示符发送和接收东西。不过,我遇到了一些问题。这是我的命令行代码:
public class CommandLine {
private Process cmdProcess;
private BufferedReader reader;
private BufferedWriter writer;
private StringBuffer bf;
private String ls = System.getProperty("line.separator");
public CommandLine() {
}
public void connect(){
try{
cmdProcess = Runtime.getRuntime().exec("cmd /b start");
reader = new BufferedReader(new InputStreamReader(cmdProcess.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(cmdProcess.getOutputStream()));
bf = new StringBuffer();
} catch(Exception e){ }
}
public void sendCommand(String command){
try {
writer.write(command + ls);
writer.flush();
} catch(Exception e){
e.printStackTrace();
}
}
public void getContent(){
String s;
while((s = readResponse()) != null){
System.out.println(s);
}
}
public String readResponse(){
try{
return reader.readLine();
} catch(Exception e){
return null;
}
}
public void disconnect(){
try{
sendCommand("quit");
reader.close();
writer.close();
} catch(Exception e){
e.printStackTrace();
}
}
public void reset(){
try {
reader.reset();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这就是问题所在。当我在我的主要方法中并执行以下操作时:
public static void main(String [] args){
CommandLine cmd = new CommandLine();
cmd.connect();
cmd.sendCommand("dir");
cmd.getContent();
System.out.println("Here");
}
“这里”永远不会被打印出来。所以我很好奇我做错了什么。另外我希望能够发送一个命令,然后只读取那个响应。我在想也许我可以在阅读器上使用 reset() 来做到这一点,但我不确定。如果这还不够清楚,我的意思是我不希望响应只是附加到 StringBuffer 或类似的东西。
任何帮助将不胜感激
【问题讨论】:
-
读取正在运行的进程的响应将不会完成,因为它没有到达 EOF...
-
有没有办法让我可以阅读回复并让他们完成?
-
制作命令外壳比您尝试做的要复杂得多。最好的办法是启动和 cmd 进程,包含您的命令 (dir),然后完成 cmd 进程,这样您就可以从该进程中获取输出。您一次只能处理一个命令。
-
我知道制作 shell 很困难。我用java做了很多,我从来没有接触过创建shell。我想我会把它作为一个副项目来试一试。如果你能带领我走上正确的道路,那就太好了。不要求代码或任何东西,只是一个开始的地方。无论是使用 Socket 连接还是完全不同
标签: java shell process bufferedreader bufferedwriter