2013-12-01 3 views
0

Я новичок в Java, поэтому извиняюсь за то, что, вероятно, очень наивный вопрос. Я пишу приложение, которое будет общаться с несколькими другими процессами. Последний будет читать и писать с stdin и stdout. Я хотел бы перенаправить их ввод и вывод в файлы конкретных процессов и читать и писать оттуда.Блокировка ввода в Java

У меня, похоже, проблемы с читающей частью. В частности, если данные еще не появились во входном файле, то InputStream.read(), кажется, возвращает -1, а не ждет его. Я немного искал решение, и все, что я нашел, похоже, указывает на то, что проблема заключается в том, что преждевременное закрытие потока. Я не думаю, что я это делаю.

Вот некоторые фрагменты соответствующего кода:

class Player { 
    public Player(String Infile, String Outfile, int initBankRoll) { 
      File inFile; 
      File outFile; 

      try { 
       reader = new FileInputStream(Infile); 
      } 
      catch (IOException ioe) { 
       System.err.println("Could not open " + Infile); 
       } 
    ... 
    } 

    public String readln() { 
     StringBuilder sb = new StringBuilder(80); 
     int i; 
     try { 
      while ((i = reader.read()) != '\n') { 
     sb.append(i); 
      } 
     } catch (IOException ioe) { 
      System.err.println("Could not read from file."); 
     } 
    return sb.toString(); 
    } 

Для чего это стоит, я предпочел бы иметь быстрое решение, чем элегантный один. Спасибо за любую помощь, которую любой может предоставить!

Ох - это может быть актуально. Я пытаюсь проверить отправку на входе, набрав кота -> TestFile на терминале ...

+0

Передача данных через TCP может быть хорошим решением для communating между приложениями –

+0

Спасибо за то, MJafar - Я думал об этом, и это может быть лучшим подходом. Я как бы собираюсь быстро и грязно на этом этапе :) – user3054726

+0

Я изменил свой код на просто цикл, получая -1: while ((i = reader.read()) == -1); \t sb.append ((char) i); \t while ((i = reader.read())! = '\ N') { \t \t System.err.println ("Got:" + ((char) i)); \t \t sb.append ((char) i); \t} Это похоже на работу, но кажется ужасной тратой машинных циклов ... – user3054726

ответ

0

Я не знаю, я понимаю ваш вопрос правильно, но в основном вы хотите читать строки из файла, и если есть нет другой линии, вы хотите подождать? Правильно?

Если да, то это может быть решение:

public static void main(String [] args) 
{ 
    Player player = new Player("C:\\Data\\test.txt"); 
    while(true) {//do whatever condition you want here 
     System.out.println("Write:"); 
     String line = player.readln(); 
     System.out.println(line); 
    } 
} 
public class Player { 
    BufferedReader bufferedReader; 

    public Player(String fileName) { 
     try { 
      bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), Charset.forName("UTF-8"))); 
     } 
     catch (IOException ioe) { 
      System.err.println("Could not open " + fileName); 
     } 
    } 

    public String readln() { 
     String line = null; 
     try { 
      while(true){ //this will wait till new line in file 
       if((line = bufferedReader.readLine())!= null) 
        return line; 
      } 
     } catch (IOException ioe) { 
      System.err.println("Could not read from file."); 
     } 
     return line; 
    } 
} 
Смежные вопросы