Я рассмотрел многие вопросы, касающиеся ввода/вывода из порожденного процесса на Java, но я все еще не могу понять, что не так с моей программой. Это очень короткий и простой, но он не работает. Я использую метод exec() объекта Runtime для создания нового процесса (я знаю, что ProcessBuilder, вероятно, лучше, но это для простого назначения, и мне действительно не нужно беспокоиться о stderr порожденного процесса) ,Простой процесс ввода/вывода Java-процесса
Я запускаю класс «Процессор» самостоятельно из командной строки IDE /. Memory.java находится в том же каталоге.
public class Memory
{
public static void main(String[] args)
{
System.out.println("Memory works!");
}
}
И другая программа:
import java.io.IOException;
import java.io.InputStream;
public class Processor
{
public static void main(String[] args)
{
Runtime rt = Runtime.getRuntime();
Process proc = null;
try {
proc = rt.exec("java Memory"); //execute Memory.java which is in same directory
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(2); //exit code 2 means that process creation failed.
}
//stream to get output from memory
InputStream fromProcess = proc.getInputStream();
int x;
try {
while((x = fromProcess.read()) != -1)
System.out.print((char)x);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Там нет выхода, и программа никогда не завершается. Теперь это может быть из-за цикла while в памяти для сканера, но тогда должен быть какой-то выход хотя бы правильно?
«Мне действительно не нужно беспокоиться о stderr порожденного процесса» ... посмотрите на него: он обязательно скажет вам, что вы ошибаетесь ;-) – ben75
Я рекомендую вам пару шагов отладки вы можете использовать, чтобы понять, что происходит. Во-первых, позаботьтесь о stderr, поскольку это может указывать на вашу проблему. Во-вторых, попробуйте запустить другую команду, и вы убедитесь, что она выведет на stdout в качестве команды ls или dir, в зависимости от того, какой os вы работаете. Если вы видите вывод, это также может указать вам, какой текущий каталог используется, что было бы полезно просто чтобы быть уверенным в правильном контексте. Наконец, я просто проверяю, имеет ли текущий каталог выполнения класса процессоров скомпилированный файл memory.class? –
Я отбросил ваши массивные правки ... поскольку они делают текущие ответы бесполезными. Если у вас все еще возникают проблемы с кодом, а другие рекомендации перечислены как добавление шагов отладки, задайте отдельный вопрос, который сужает новые проблемы, которые у вас есть, и включите соответствующий вывод. – rolfl