Java Konsole über Buffered Reader Zeilenweise auslesen ?

Master3000

Mitglied
Hallo,
ich möchte Daten über Sockets verschicken und empfangen welche dann in der Konsole angezeigt werden und dann von einem BufferedReader zeilenweise ausgelesen werden.
Die Sockets funktionieren, der BufferedReader für die Konsole nicht.

[CODE lang="java" title="BufferedReader"] BufferedReader file = new BufferedReader(new FileReader(System.in));
StringBuffer inputBuffer = new StringBuffer();


while ((line = file.readLine()) != null) {

}[/CODE]

Danke für alle Lösungsansätze und Hilfe
 
new FileReader(System.in)
macht so doch gar keinen Sinn. Hast Du Dir einmal die Dokumentation von System und von FileReader angesehen?

System.in ist ja auch keine Datei, daher macht ein Reader, der Dateien einlesen soll, auch gar keinen Sinn.

System.in ist ein InputStream.
Um von einem InputStream ein Reader zu bekommen, gibt es die Klasse InputStreamReader.
So könntest Du dann den BufferedReader auf System.in bekommen.
 
new FileReader(System.in)
macht so doch gar keinen Sinn. Hast Du Dir einmal die Dokumentation von System und von FileReader angesehen?

System.in ist ja auch keine Datei, daher macht ein Reader, der Dateien einlesen soll, auch gar keinen Sinn.

System.in ist ein InputStream.
Um von einem InputStream ein Reader zu bekommen, gibt es die Klasse InputStreamReader.
So könntest Du dann den BufferedReader auf System.in bekommen.
Was ist der beste die Konsole auszulesen ?
 
Das mit dem BufferedReader kannst Du prinzipiell so machen. Du musst halt nur den FileReader durch einen InputStreamReader ersetzen.

Du kannst aber auch andere Wege nutzen - Scanner wäre z.B. noch eine Möglichkeit.
 
welche dann in der Konsole angezeigt werden und dann von einem BufferedReader zeilenweise ausgelesen werden.
Warum gibst du die (bekannten) Daten in der Konsole aus, um sie anschließend wieder einlesen zu wollen?

Du weißt doch schon, welche Daten auf der Konsole stehen.

Oder habe ich das Problem nicht verstanden?
 
Die Daten werden auf einen anderen Computer geschickt auf welchem sie aus der Konsole ausgelesen werden sollen.
Sie sind also unbekannt.
Wie kann man mit einem Scanner Zeilenweise die Konsole einlesen ?

Danke bis jetzt
 
Was genau bedeutet "aus der Konsole ausgelesen werden sollen"?

Ich bin davon ausgegangen, dass es sich um Eingaben eines Nutzers an der Konsole handelt. Und das kann man sehr gut mit einem BufferedReader machen:
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));

Oder auch gerne mit einem Scanner (Interessant, wenn man nur Token lesen will und nicht ganze Zeilen);
Scanner scanner = new Scanner(System.in);

Wenn dein "aus der Konsole ausgelesen werden sollen" aber irgend was anderes bedeutet (Also z.B. irgendwelche Ausgaben, die gemacht wurden, zu lesen), dann solltest Du einfach das Design komplett überdenken oder einfach einmal genau beschreiben, was Du überhaupt vor hast!
 
Wie kann man nun mit einem Scanner zeilenweise die Konsole einlesen ?

Bei einem BufferedReader kann man ja einfach:
[CODE lang="java" title="BufferedReader Zeilenweise"] while ((line = file.readLine()) != null) {

}[/CODE]

Womit müsste ich das ersetzen damit das für einen Scanner geht ?
 
PC1 verschickt über Socket1 Daten an PC2 welcher diese über Socket 2 Empfängt.
PC2 weiß vorher nicht was verschickt wird.
PC2 bekommt diese und schreibt sie Zeilenweise in die Konsole.
PC2 möchte nun die Daten aus der Konsole Zeilenweise einlesen damit sie getrennt verarbeitet werden können.
 
Vermutlich handelt es sich aber gar nicht um die selbe Konsole, in welche auf PC2 geschrieben wird und die in welcher das Java-Programm auf PC2 läuft.
Man müsste also mit pipe arbeiten: externalCommand | myJavaProgram

Java:
public class Main {
  public static void main(String[] args) {
      System.out.println("----- Main started -------");
      try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
          String line = null;
          while (true) {
              if ((line = reader.readLine()) != null) {
                  System.out.println("echo>> " + line);
              } else {
                  // somthing
                  break;
              }
          }
      } catch (Exception e) {
          System.err.println(e);
      }
  }
}
[CODE title="myJavaProgram.bat"]
@echo off
java -classpath target\classes example.Main
[/CODE]
Code:
dir d:\test | myJavaProgram
----- Main started -------
echo>>  Volume in drive D is Data
echo>>  Volume Serial Number is *********
echo>>
echo>>  Directory of d:\test
echo>>
echo>> ********************    <DIR>          .
echo>> ********************    <DIR>          ..
echo>> ********************             2,508 logging.properties
...

dir steht hier nur beispielhaft für das externalCommand
 
PC1 verschickt über Socket1 Daten an PC2 welcher diese über Socket 2 Empfängt.
PC2 weiß vorher nicht was verschickt wird.
PC2 bekommt diese und schreibt sie Zeilenweise in die Konsole.
PC2 möchte nun die Daten aus der Konsole Zeilenweise einlesen damit sie getrennt verarbeitet werden können.
Läuft auf PC1 ein einzelnes Programm,oder laufen auf PC2 zwei getrennte Programme?


Vermutlich handelt es sich aber gar nicht um die selbe Konsole, in welche auf PC2 geschrieben wird und die in welcher das Java-Programm auf PC2 läuft.
Ich würde vermuten, dass auf PC2 nur genau ein Programm läuft, aber ein fundamentales Missverständnis der Grundlagen vorliegt...
 
Ok, wenn mit "von der Konsole lesen" nun offensichtlich keine User-Eingabe gemeint ist, dann ist erst einmal wichtig: Dies ist so nicht möglich!


Wenn es zwei unterschiedliche Programme sind (Also Programm 1 empfängt Daten und schreibt diese auf die Standardausgabe und Programm 2 soll die Daten verarbeiten), dann kannst Du die Ausgabe von Programm 1 als Eingabe von Programm 2 "pipen". Dazu dient dann das "pipe" Symbol und sieht ungefähr so beim Aufruf auf der Eingabeaufforderung aus:
Programm1 -option1 - option2 -arg xyz | Programm2 -irgendwas -was anderes

Für Programm2 wäre es dann wie eine Nutzereingabe zu handhaben, d.h. es wird einfach von System.in gelesen.

Wenn es nur ein Programm ist, dann ist das Geheimnis einfach, die Daten nicht nur auszugeben sondern für die weitere Verarbeitung auch zu speichern.

Eine weitere Alternative kann bei Zwei Programmen auch sein, dass das Programm2 das Programm1 startet. Dann hat es die Kontrolle und kann da auf die Standard Streams zugreifen und diese auslesen bzw. beschreiben.
 
Wenn (falls) die Clientanwendung (PC2) von dir selbst geschrieben wurde, was spricht dann dagegen, die empfangenen Daten gar nicht erst auf die Konsole zu schreiben, sondern gleich im Client zu verarbeiten?
 
Zuletzt bearbeitet:
Ich habe einen Versuch gemacht.
Was mache ich hier falsch ?

Java:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.*;

class Main {

  static String g;

  public static void main(String[] args) throws IOException {
    System.out.println("Hello world!");


            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        //StringBuffer inputBuffer = new StringBuffer();
    
        String line;
    
        while ((line = reader.readLine()) != null) {
      g = line;
          System.out.println(g);
    }
          System.out.println(g);
  }
}
 
Empfangen und auswerten wird im selben Script gemacht.
Auswerten außerhalb der Konsole würde natürlich auch gehen jedoch weiß ich nicht wie ich das ganze Zeilenweise mache.
Ausgewertet werden sollen die Daten nämlich mit:
[CODE lang="java" title="analyse"] if (line .contains("was man rausfiltern möchte")){
h = line
}[/CODE]

Danke bis jetzt
 
So ist es.
Weil ich nicht genau weiß wie ich die Daten sonst Zeilenweise auswerten soll.

Na, dann sind wir ja endlich an einem Punkt angelangt, an dem man vielleicht helfen kann. Das hättest du schon 20 Beiträge früher haben können.

Wie sieht denn der Code aus, mit dem du die Konsolenausgabe machst, bzw. die Daten empfängst?
 
Wenn man sich nicht vernünftig ausdrückt, dann kann auch nicht geholfen werden. Ich mache noch einen Versuch. Evtl. kommen die Daten aus einem Socket:
Java:
        final Socket socket = ...
        try(DataInputStream dIn = new DataInputStream(socket.getInputStream())) {
            while(true) {
                final String message = dIn.readUTF();
                try(final BufferedReader reader = new BufferedReader(new StringReader(message))) {
                    String line;
                    while ((line = reader.readLine()) != null) {
                        if (line.indexOf("9") > -1) {
                            System.out.println("Zeile gefiltert!");
                        } else {
                            System.out.println("Zeile OK: " + line);
                        }
                    }
                }
            }
        }
Es geht mir nur ums Prinzip, das ist keine Lösung zum kopieren.
 

Neue Themen


Zurück
Oben