Итак, я пишу программу на Java, которая должна быть в состоянии работать в Windows или Linux и должна иметь возможность отправлять запросы в командную строку, такие как dir или ls. Затем он должен получить результирующий вывод из этих команд и запрос AFTERWARDS для другой команды. Вот мой код:
import java.io.*;
import java.util.*;
public class myShell
{
public static void main(String[] args)
{
Runtime runtime = Runtime.getRuntime();
Process process;
Scanner keyboard = new Scanner(System.in);
String userInput = "";
String osName = System.getProperty("os.name" );
BufferedReader brStdOut = null;
String stdOut;
BufferedReader brErrorStream = null;
String errorStream;
while(userInput.compareToIgnoreCase("exit") != 0)
{
System.out.println();
System.out.print("??");
userInput = keyboard.nextLine();
int indexOfPound = userInput.indexOf('#');
if(indexOfPound == 0)
{
userInput = "";
}
else if(indexOfPound > 0)
{
userInput = userInput.substring(0, indexOfPound);
}
userInput = userInput.trim();
try
{
if(osName.contains("Windows"))
{
process = runtime.exec("cmd /c " + userInput);
}
else
{
process = runtime.exec(userInput);
}
brStdOut = new BufferedReader(new InputStreamReader(
process.getInputStream()));
brErrorStream = new BufferedReader(new InputStreamReader(
process.getErrorStream()));
while((stdOut = brStdOut.readLine()) != null)
{
System.out.println(stdOut);
}
while((errorStream = brErrorStream.readLine()) != null)
{
System.err.println(errorStream);
}
process.waitFor();
}
catch(Exception e)
{
System.out.println("Error executing: " + userInput);
System.out.println(e.getMessage());
}
try
{
brStdOut.close();
}
catch(Exception e)
{
}
try
{
brErrorStream.close();
}
catch(Exception e)
{
}
}
System.exit(0);
}
}
Я должен упомянуть, что в настоящее время я тестирую на компьютере с Windows 7, и что-либо после # в строке считается комментарием.
Когда я запускаю это, скажем, используя dir, результат возвращается просто отлично, но попробуйте запустить его с помощью ls (который выдает сообщение о том, что это не распознанная команда в Windows), и поток ошибок может быть напечатан до следующей подсказка (??) (что желательно), после следующей подсказки или частично до и частично после подсказки. Есть ли способ последовательно получать сообщение об ошибке печати ДО приглашения?
Вот пример того, что происходит сейчас:
??dir
Volume in drive C is Windows7_OS
Volume Serial Number is SomeNumbers
Directory of C:\Users\BlankedOut\Documents\Java\Eclipse\Workspace\Prog1
02/05/2012 03:48 PM <DIR> .
02/05/2012 03:48 PM <DIR> ..
02/05/2012 03:48 PM 301 .classpath
02/05/2012 03:48 PM 387 .project
02/05/2012 03:48 PM <DIR> .settings
02/05/2012 08:39 PM <DIR> bin
02/05/2012 08:39 PM <DIR> src
2 File(s) 688 bytes
5 Dir(s) 861,635,362,816 bytes free
??ls
??'ls' is not recognized as an internal or external command,
operable program or batch file.
ls
'ls' is not recognized as an internal or external command,
operable program or batch file.
??exit
Мой другой вопрос касается того, когда я пытаюсь запустить такую команду, как дата. В окне DOS это дает двухстрочный ответ и ждет большего ввода, но в Java я получаю только первую строку ответа (хотя с помощью dir я, кажется, получаю все строки), но затем после этой первой даты линия, программа просто зависает ... кто-нибудь знает, почему это может происходить?
Большое спасибо!