2017-09-27 11 views
1

J'essaie d'imprimer un message selon qu'un message spécifique précédent a été imprimé ou non. Voici mon code:Essayer de lire la console à partir d'anciennes impressions Java

public class Main { 

    public static Runnable getRunnable() { 

    return() -> { 
     System.out.println("Hello from a thread"); 

    }; 
} 

public static void main(String[] args){ 

    new Thread(getRunnable()).start(); 

    Scanner scanner = new Scanner(System.in); 
    String name = scanner.next(); 

     if (name.equals("Hello from a thread")) { 
      System.out.println("Hi!"); 
    } else { 
      System.out.println("That's not nice"); 
     } 
    } 
} 

Je sais que Scanner est probablement pas ici la solution, mais chaque fois que j'essayer quelque chose d'autre comme System.console.readLine(), ce qui est sans doute pas non plus correct, il imprime un NullPointerException. Que suis-je censé utiliser ici pour lire les résultats précédents?

MISE À JOUR: Hey, je l'ai encore essayé mais ça n'a pas marché ... je ne sais pas pourquoi encore. Voici mon code mis à jour

public static ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
public static PrintStream ps = new PrintStream(baos); 
public static PrintStream old = System.out; 

public static Runnable getRunnable() { 
    System.out.println("Hello from a thread"); 
    return() -> { 
     System.setOut(ps); 
     System.out.println("Hello from a thread"); 
    }; 
} 

public static void main(String[] args){ 

    new Thread(getRunnable()).start(); 

    try { 
     TimeUnit.SECONDS.sleep(3); 
    } catch (InterruptedException e) { 
     System.out.println("Somethings wrong!"); 
    } 

    System.out.flush(); 
    System.setOut(old); 
    if (baos.toString().equals("Hello from a thread")) { 
     System.out.println("Hello other thread!"); 
    } 

} 

}

+1

Peut-être que cela peut vous aider https://stackoverflow.com/questions/8708342/redirect-console-output-to-string-in-java –

Répondre

1

System.out n'est pas System.in

System.out est le flux de sortie standard, qui imprime habituellement à la console. System.in est le flux d'entrée standard, qui provient généralement de la console. Vous pouvez faire setOut, setIn et setErr pour modifier les flux d'E/S, donc pour votre cas, vous devrez rediriger in pour lire à partir d'une source et out pour sortir vers cette source. Vous pouvez envisager d'utiliser un ArrayList pour stocker et récupérer la sortie/entrée: (. Notez que pour diverses raisons, vous voudrez probablement faire setErr afin que vous puissiez les choses encore sortie correctement)

final List<Integer> list = new ArrayList<>(); 
System.setOut(new PrintStream(new OutputStream() { 
    public void write(int b) { 
     list.add(b); 
    } 
})); 
System.setIn(new InputStream() { 
    public int read() { 
     if (list.size() == 0) return -1; 
     return list.remove(0); 
    } 
}); 

Vous pouvez essayer un exemple de travail de ceci here

+0

Mais comment ce code pourrait-il sortir d'un méthode différente? – koory