Input/Output InputStream Listener?

pr0ggr

Mitglied
Hi,

ich habe in meinem Programm einen InputStream mInput, dessen Inhalt sich in unregelmäßigen Abständen ändert. Jedes mal wenn sich der Inhalt ändert soll er analysiert werden.

Um ihn auf Veränderung zu prüfen, habe ich bisher folgenden Code:

Java:
String refdata = "";
//output ist ein String der den Inhalt des InputStreams enthält.
//output wird bei Änderung des InputStreams mInput mitverändert (anderer Thread)
     while(true){
         while(output.equals(refdata)){
          Thread.yield();       
         }
         refdata = output;
         System.out.println("<!-- Event triggered. -->");
     }

Das Problem hierbei ist allerdings der unverhältnissmäßige Ressourcenverbrauch. Zwar verwende ich Thread.yield(); aber das scheint nicht viel zu helfen. An dem Verbrauch ist wohl die ständige Prüfung der while-Bedingung Schuld.

Jetzt will ich fragen ob es einen entsprechenden Listener gibt, der bei Veränderung eines InputStreams ausschlägt und somit von sich aus meldet ob was passiert ist, statt die ganze Zeit aktiv zu überprüfen zu müssen.
 

Michael...

Top Contributor
Jetzt will ich fragen ob es einen entsprechenden Listener gibt, der bei Veränderung eines InputStreams ausschlägt und somit von sich aus meldet ob was passiert ist, statt die ganze Zeit aktiv zu überprüfen zu müssen.
Was meinst Du mit "Veränderung eines InputStreams"?? Das ist ein Datenstrom, dessen Inhalt man ausliest. Wie willst Du da einen Listener an den Datenstrom hängen?

Das Lesen eines Datenstroms ist blockiert, d.h. der Thread wartet solange bis es was zu lesen gibt. Man kann also einfach den Stream auslesen und auf Schlüsselwörter/daten reagieren.

Was genau hast Du vor?
 

Gregorrr

Bekanntes Mitglied
Hi,

also ich weiß jetzt nicht ob das passt, oder ob das richtig ist, aber mal rein von der Logik her gesehen:

Ein Stream ist doch ein kontinuierlicher Fluss an Bytes. Solange Bytes zum Lesen/Schreiben vorhanden sind, dann ändert sich auch der Stream. Wenn keine Zeichen vorhanden sind, dann ändert sich der Stream nicht. Dazu gibt es ja die Methode read(), die beim Ende -1 zurück gibt. Vielleicht kannst du die -1 abfragen. D.h. erst wenn du das Ende des Streams erreicht hast, vergleiche den String. Ansonsten vergleicht er ja bei jeder Zeichenänderung?! den String.

Oder mit available() abfragen, wie viel gelsen werden kann. Lesen. Dann vergleichen, und so weiter?

Ansonsten (zusätzlich) das Observer-Pattern implementieren und bei Veränderung des InputStreams, d.h. aber erst wenn er ganz gelesen ist, alle Observer benachrichtigen?

Eventuell hilft das: http://www.java-forum.org/java-basi...nputstream-read-readline-blockiert-immer.html
 

pr0ggr

Mitglied
Was meinst Du mit "Veränderung eines InputStreams"?? Das ist ein Datenstrom, dessen Inhalt man ausliest. Wie willst Du da einen Listener an den Datenstrom hängen?

Das Lesen eines Datenstroms ist blockiert, d.h. der Thread wartet solange bis es was zu lesen gibt. Man kann also einfach den Stream auslesen und auf Schlüsselwörter/daten reagieren.

Wenn ich den InputStream auslese ist er ja zwischendurch irgendwann leer (zumindest wenn die Daten in Abständen kommen). Wenn dann wieder was kommt und er nicht mehr leer ist dann sollen die neu angekommenen Daten irgendwie verarbeitet werden ("<!-- Event triggered. -->").

Meine Frage war ob es eine Möglichkeit gibt (evtl. Listener oder ähnliches) dass das Event von sich aus ausgelöst wird und nicht andauernd wie in meinem Code-Beispiel AKTIV geschaut werden muss ob neue Daten ankommen.
 

Gregorrr

Bekanntes Mitglied
Wenn ich den InputStream auslese ist er ja zwischendurch irgendwann leer (zumindest wenn die Daten in Abständen kommen). Wenn dann wieder was kommt und er nicht mehr leer ist dann sollen die neu angekommenen Daten irgendwie verarbeitet werden ("<!-- Event triggered. -->").

Meine Frage war ob es eine Möglichkeit gibt (evtl. Listener oder ähnliches) dass das Event von sich aus ausgelöst wird und nicht andauernd wie in meinem Code-Beispiel AKTIV geschaut werden muss ob neue Daten ankommen.

Du vergleichst oben aber nicht, wenn neue Daten ankommen - du vergleichst die ganze Zeit mit deiner Endlosschleife. Du kannst ja mit read() => -1 erst ab dem Zeitpunkt vergleichen, wenn keine neuen Daten mehr ankommen?!
 

Michael...

Top Contributor
Meine Frage war ob es eine Möglichkeit gibt (evtl. Listener oder ähnliches) dass das Event von sich aus ausgelöst wird und nicht andauernd wie in meinem Code-Beispiel AKTIV geschaut werden muss ob neue Daten ankommen.
Wie gesagt das Lesen vom Stream ist blockierend. Es wird einfach weiter gelesen, sobald es etwas zu lesen gibt und es muss nicht aktiv nachgeschaut werden, ob es auf dem Stream was neues zum Lesen gibt. Der Thread pausiert solange.
Das was Du versuchst mit dem "Listener" nachzubauen, ist bereits im Auslesemechanismus implementiert.
 

pr0ggr

Mitglied
Du vergleichst oben aber nicht, wenn neue Daten ankommen - du vergleichst die ganze Zeit mit deiner Endlosschleife. Du kannst ja mit read() => -1 erst ab dem Zeitpunkt vergleichen, wenn keine neuen Daten mehr ankommen?!

Ja aber das muss ich ja auch wieder regelmäßig prüfen.

Wie dem auch sei, es funktioniert jetzt.
Im Prinzip war die entscheidende Tatsache dass ich jetzt weiss dass mInput.read(); solange blockt bis wieder was kommt.

Danke.

//EDIT: Michael, genau das hab ich nicht gewusst.
 

tagedieb

Top Contributor
Mal abgesehen von deinen Inputstreams hast du es hier mit dem klassischen Producer-Consumer Design-Pattern zu tun.

Du benutz am Besten eine LinkedBlockingQueue (Java Platform SE 6). Die ist bereits synchronisiert und blockt den Lese-Thread falls die Queue leer ist und du auf einen neuen Inputstream warten musst. Alternativ kannst du auch das alte Synchronized-Wait-Notify Pattern verwenden.

Java:
//Producer.java
// neuen InputStream in die Queue legen 
queue.offer(newInputStream);


// Consumer.java
BlockingQueue<InputStream> queue = new LinkedBlockingQueue<InputStream>();

public void run() {
  while(true) {
    InputStream is = queue.take();
    // do something....
  }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
berserkerdq2 inputstream und bufferedwirter /outputstream und bufferedwriter Java Basics - Anfänger-Themen 9
T Bluetooth, Inputstream Java Basics - Anfänger-Themen 0
I InputStream beim zweiten Mal fehlerhaft Java Basics - Anfänger-Themen 10
B Inputstream in file schreiben? Java Basics - Anfänger-Themen 23
B InputStream / OutputStream / PipedOutputStream und managedExecutorService Java Basics - Anfänger-Themen 3
B java.io.OutputStream zu java.io.InputStream konvertieren Java Basics - Anfänger-Themen 18
B Hilfe bei InputStream To File Java Basics - Anfänger-Themen 22
B InputStream (PDF) nach Image (PNG / JPG) konvertieren? Java Basics - Anfänger-Themen 2
B Konvertieren: Outputstream zu Inputstream Java Basics - Anfänger-Themen 13
J Was genau macht die Methode close() im InputStream? Java Basics - Anfänger-Themen 5
E InputStream im Servlet wirft Exception Java Basics - Anfänger-Themen 5
D InputStream parsen und als Bilddatei abspeichern Java Basics - Anfänger-Themen 1
G Input/Output InputStream gibt nicht die Korrekten Werte aus Java Basics - Anfänger-Themen 10
T Datentypen InputStream to list of Int (or similar) Java Basics - Anfänger-Themen 4
P bytes aus einem InputStream zählen Java Basics - Anfänger-Themen 2
P InputStream eines Musik-Streams abspielen Java Basics - Anfänger-Themen 2
I Resize Image - Einlesen von InputStream Java Basics - Anfänger-Themen 3
T Input/Output Exception bei einem InputStream Java Basics - Anfänger-Themen 2
W ProcessBuilder InputStream in Array speichern Java Basics - Anfänger-Themen 3
K InputStream erstellen Java Basics - Anfänger-Themen 4
B Input/Output Data / Buffer / File Outstream Inputstream Java Basics - Anfänger-Themen 2
L Webservice soll InputStream übergeben bekommen Java Basics - Anfänger-Themen 7
S Eigener InputStream, Hilfe bei read-Methode Java Basics - Anfänger-Themen 6
C InputStream Java Basics - Anfänger-Themen 2
O Input/Output Fragen zum InputStream Java Basics - Anfänger-Themen 7
E Input/Output Relativer Bild-Pfad für InputStream Java Basics - Anfänger-Themen 5
G Frage zu InputStream? Java Basics - Anfänger-Themen 11
E Socket InputStream "terminiert" nicht Java Basics - Anfänger-Themen 4
E Input/Output Inputstream während der Laufzeit füllen Java Basics - Anfänger-Themen 2
A Frage zu Beispiel eines Dekorierers von InputStream Java Basics - Anfänger-Themen 4
B Input/Output InputStream (JSch) in OutputStream (Blob) überführen Java Basics - Anfänger-Themen 8
M Eigener InputStream will nicht mit BufferedReader Java Basics - Anfänger-Themen 3
S Input/Output Neuen InputStream System.in setzen Java Basics - Anfänger-Themen 11
A InputStream gibt nur jede 2te Zeile aus Java Basics - Anfänger-Themen 7
J InputStream FTP Java Basics - Anfänger-Themen 8
brunothg Inputstream zu Filechannel Java Basics - Anfänger-Themen 6
K StringWriter/String nach InputStream konvertieren Java Basics - Anfänger-Themen 3
Benji0815 Inputstream aus Konsole in JTextArea Java Basics - Anfänger-Themen 14
A Problem mit InputStream Java Basics - Anfänger-Themen 4
bastiann Kann man Inputstream nur auf ein Zeichen anwenden? Java Basics - Anfänger-Themen 5
U Inputstream.read()/readLine() blockiert immer Java Basics - Anfänger-Themen 18
S Problem mit url, inputStream und bytes beim Quellcode laden. Java Basics - Anfänger-Themen 6
G Kompletten InputStream der Kommandokonsole ausgeben Java Basics - Anfänger-Themen 8
G InputStream aufrufen, ändern und zurück geben Java Basics - Anfänger-Themen 2
W Zeichen ersetzen im InputStream Java Basics - Anfänger-Themen 3
N String vom InputStream in TextArea übertragen Java Basics - Anfänger-Themen 6
A Frage zu Puffergröße bei InputStream Java Basics - Anfänger-Themen 9
G in einem inputstream auf " " abfragen? Java Basics - Anfänger-Themen 3
M Datei speichern mittels InputStream Java Basics - Anfänger-Themen 13
P InputStream in Byte-Array speichern Java Basics - Anfänger-Themen 2
G String in InputStream umwandeln? Java Basics - Anfänger-Themen 8
M Auslesen eines InputStream Java Basics - Anfänger-Themen 4
M Problem mit InputStream Java Basics - Anfänger-Themen 7
S Probleme mit InputStream- Rückgabe Java Basics - Anfänger-Themen 4
I InputStream von Konsole abfangen Java Basics - Anfänger-Themen 6
G InputStream im finally-Block schließen Java Basics - Anfänger-Themen 7
K InputStream? Java Basics - Anfänger-Themen 3
S Sockets and InputStream Java Basics - Anfänger-Themen 2
M InputStream einer Socketverbindung funktioniert nicht Java Basics - Anfänger-Themen 19
M Byte InputStream zu Zeichenformat Unicode bzw String konvert Java Basics - Anfänger-Themen 5
R InputStream erstellen, der aus String liest Java Basics - Anfänger-Themen 8
R ENTER in InputStream nicht lesen Java Basics - Anfänger-Themen 4
G InputStream auslesen und zurückschreiben Java Basics - Anfänger-Themen 9
R BufferedReader <-> InputStream Java Basics - Anfänger-Themen 3
R Suche geeignetes InputStream Java Basics - Anfänger-Themen 2
D InputStream -> Image Java Basics - Anfänger-Themen 6
M String zu InputStream/InputSource Java Basics - Anfänger-Themen 2
S Problem mit InputStream / flush() / BufferedReader Java Basics - Anfänger-Themen 19
C Aus ein Image-Objekt einen InputStream generieren? Java Basics - Anfänger-Themen 6
J InputStream in String umwandeln Java Basics - Anfänger-Themen 5
J InputStream ist null Java Basics - Anfänger-Themen 7
P InputStream, BufferedString Java Basics - Anfänger-Themen 3
T Variable durch Action Listener ändern Java Basics - Anfänger-Themen 2
D String value change listener Java Basics - Anfänger-Themen 2
topi WindowAdapter / Listener / Event Java Basics - Anfänger-Themen 4
L Problem mit Listener Java Basics - Anfänger-Themen 0
P Listener registrieren Java Basics - Anfänger-Themen 40
Salo JTabel Selection listener Bsp. Java Basics - Anfänger-Themen 3
W JLabel, Farbe durch Listener ändern Java Basics - Anfänger-Themen 6
M Listener für Button - Wert von Variablen verändern Java Basics - Anfänger-Themen 14
V JTable welcher Listener ? Java Basics - Anfänger-Themen 7
J Verständnis Problem Java-Listener. Java Basics - Anfänger-Themen 59
M Compiler-Fehler Using action listener Java Basics - Anfänger-Themen 1
F Listener schreiben Java Basics - Anfänger-Themen 1
P Eigene Knöpfe mit eigenem Listener Java Basics - Anfänger-Themen 5
B Listener beim Laden (deserialize) wieder hinzufügen bzw. mitspeichern? Java Basics - Anfänger-Themen 3
J Listener Java Basics - Anfänger-Themen 4
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
llabusch Kombinationsfeld - LISTENER Java Basics - Anfänger-Themen 0
S Eigenen Listener zu eigenen Button! Java Basics - Anfänger-Themen 5
S Listener reagieren nicht mehr Java Basics - Anfänger-Themen 3
O Laufender Timer+Action Listener in Thread VS isAlive() Java Basics - Anfänger-Themen 4
E Mein eigener Listener (Hilfe gesucht) Java Basics - Anfänger-Themen 2
K On Click listener Problem Java Basics - Anfänger-Themen 4
L JTextField/Listener Input Problem Java Basics - Anfänger-Themen 2
M Listener einerm JPanel hinzufuegen Java Basics - Anfänger-Themen 3
G Listener ohne Objekt Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben