2013-09-15 3 views
1

Я хотел создать что-то вроде пульта дистанционного управления для командной строки в Windows.Получение выходного потока «cmd.exe» в Java

Для этого я использую сканер, но ...

Проблема заключается в том, когда я прочитал всю строку с nextLine() из потока, запрос будет отсутствовать (becouse будет напечатан, но не в строке) - и когда я прочитаю следующее слово со следующим(), разрыв строки отсутствует, и вы потеряете обзор. Однако некоторая информация даже отсутствует.

package com; 

import java.io.IOException; 
import java.util.Scanner; 

public class StdinCmd extends Thread { 
    public void run() { 
     try { 
      execute(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    public void execute() throws IOException { 
     Scanner reader = new Scanner(MainClient.getProcess().getInputStream()); // <- getting the stream 
     StdoutSocket stdoutSocket = new StdoutSocket(); 
     while (true) { 
      while (reader.hasNext()) { 
       stdoutSocket.executeNext(reader.next()); // <- send it to the socket (the controller). This is what will be displayed at the end. 
      } 
     } 
    } 
} 

Я приложил скриншот того, как он должен выглядеть, и как она выглядит в конце:

http://www.mediafire.com/?jma31ezg8ansfal

Я надеюсь, что вы можете помочь мне, и я дал вам достаточно информации!

+0

возможно дубликат [Перенаправление ввода/вывода/Ошибка Потоков Процесса CMD.exe Полностью с Java] (http://stackoverflow.com/questions/4301270/redirecting-input- output-error-streams-of-a-cmd-exe-process-full-with-java) –

ответ

1

Не используйте Scanner или BufferedReader, но вместо того, чтобы читать прямо из InputStream ...

InputStream is = null; 
try { 
    is = MainClient.getProcess().getInputStream(); 
    int in = -1; 
    while ((in = is.read()) != -1) { 
     System.out.print(((char)in)); 
    } 
} catch (IOException exp) { 
    exp.printStackTrace(); 
} finally { 
    try { 
     is.close(); 
    } catch (Exception exp) { 
    } 
} 
+0

Спасибо, много, это сработало! Теперь все в порядке! – Ercksen

+0

** РЕДАКТИРОВАТЬ ** Когда я набираю> ftp и вводим пароль моего ftp-сервера, клиент и сервер будут сбой, потому что он не перенаправляется корректно в поток с полями пароля, когда он швыряет. Есть идеи? – Ercksen

+0

Это будет проблемой при разрушении удаленных приложений такого рода, поскольку stdin/stdout больше не совпадают. Что касается растворенного вещества, я никогда не видел, чтобы кто-то придумывал его, но я не выглядел так тяжело ... – MadProgrammer

1

Лично мне очень не нравится, сканер так много. Если вы хотите прочитать строку ввода от пользователя и отправить ее через сокет. Кто не тогда просто использует BufferedReader с System.in? Прочитайте строку и отправьте ее через гнездо.

BufferedReader br = new BUfferedReader(new InputStreamReader(System.in)); 
String line = null; 
while((line = br.readLine()) != null){ 
    OutSocket.send(line); // or how you send it.. 
} 

~ Foorack

+1

Почти, но я пробовал что-то подобное раньше и помню, что он не работал без ошибок. Но все равно спасибо! – Ercksen

Смежные вопросы