Input/Output Direkt auf Eingabe reagieren

T

triopsfreak

Gast
Ich versuche auf eine Eingabe in ein File direkt zu reagieren, dazu habe ich zwei Threads:
WriteThread
Java:
class WriteThread extends Thread{
	File f = new File("C:/test.txt");
	FileWriter fw = new FileWriter(f);
	
	public WriteThread() throws Exception{
		super();
	}
	@Override
	public void run(){
		Scanner sc = new Scanner(System.in);
		while(sc.hasNextLine()){
			try {
				fw.write(sc.nextLine());
				fw.write(System.getProperty("line.separator"));
				fw.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
Es wird in die Datei geschrieben, das habe ich überprüft, aber der andere Thread reagiert nicht darauf:
ReadThread
Java:
class ReadeThread extends Thread {
	File f = new File("C:/test.txt");

	public ReadeThread() throws Exception {
		super();
	}

	@Override
	public void run() {
		Scanner sc = null;
		try {
			sc = new Scanner(f);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		while (true) {
			if (sc.hasNextLine()) {
				System.out.println(sc.nextLine());
			}
		}

	}

}

Wie muss ich das realisieren? Ich habe es auch schon ohne Endlosschleife probiert, also so:
Java:
	@Override
	public void run() {
		Scanner sc = null;
		try {
			sc = new Scanner(f);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		while(sc.hasNextLine()){
			System.out.println(sc.nextLine());
		}

	}
 
S

SlaterB

Gast
du musst schon jeweils ein komplett neues Scanner-Objekt erstellen,
es wird nur einmal auf der Festplatte nachgeschaut,
so bald das Dateiende (vor dem Schreiben) festgestellt ist ist das Scanner-Objekt eine tote Hülle,
die nur noch Standard-Antworten zurückgibt, ein Zombie ;)

das ist auch eine wichtige Grundeigenschaft von Streams, auf die sich andere Komponenten wie Zippen, Kontrollsummen usw. verlassen,
ein Stream kann nicht einfach wieder anfangen

eine Ausnahme ist System.in oder Netzwerk-Sockets, die sind einfach nie zu Ende, sondern blockieren bis zur nächsten Eingabe,
aber Dateien gehören nicht zu dieser Kategorie

------

in Schleifen solltest du Thread.sleep(100) oder ähnliches einbauen, also 100ms warten,
es reicht 10x pro Sekunde zu prüfen, nicht millionenmal
 
Zuletzt bearbeitet von einem Moderator:
T

triopsfreak

Gast
Ok, das wusste ich nicht :D
Aber oben geht ja eigentlich genau das selbe, ausser dass ich den Scanner da aus System.in aufbaue und dann einfach auf die Eingaben reagieren kann. Gibt es eine Möglichkeit das auch mit einem normalem File zu erreichen?

Edit: Wieso weisst du, was ich noch fragen wollte? :D
 
S

SlaterB

Gast
> Gibt es eine Möglichkeit das auch mit einem normalem File zu erreichen?

tja, und grundsätzlich ist dafür wohl keine API vorgesehen, du baust es ja mehr weniger selber genau dorthin,
über alle Details möchte ich nicht mutmaßen, z.B. was passiert wenn ein Teil der Datei schon eingelesen ist, dann die Datei aber neu beschrieben wird,
wegen soetwas gibt es ja auch File-Lock usw.
 
T

triopsfreak

Gast
Gut, dann habe ich gleich noch eine Frage^^
Du hast gesagt, bei Sockets ist das auch so wie bei System.in, meinst du damit den InputStream, der Socket#getInputStream() zurückgibt?
 
S

SlaterB

Gast
Sockets, System.in + Datei sind alle Streams, beim Lesen InputStreams, ja,
Datei hat eine definierte fertige Quelle, die ohne Verzögerung zum sogar vorher bekannten Ende gelesen werden kann (Länge der Datei bekannt),
die anderen beiden warten gegebenenfalls auf Benutzereingaben, machen Pause

da gibt es natürlich verschiedenste andere Beispiele, etwa ein Stream auf einem byte-Array im Speicher,
ein selbstdefinierer InputStream, der per Zufall neue Zahlen erzeugt oder wartet,
und grundsätzlich möglich ist wiederum auch, übers Netzwerk oder gar System.in eine Datei oder sonstige abgeschlossene Datenmenge zu leiten die auch ein Ende findet
 
T

triopsfreak

Gast
Ich habs geschafft, mein Thread sieht nun so aus:
Java:
class ReadeThread extends Thread {
	RandomAccessFile fil = new RandomAccessFile("C:/test.txt", "r");

	public ReadeThread() throws Exception {
		super();
	}

	@Override
	public void run() {
		while (true) {

			try {
				String s = fil.readLine();
				if (null != s) {
					System.out.println(s);
				}
				sleep(100);
			} catch (IOException e) {
				return;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

}
Ich habs also einfach mit RandomAccessFile gelöst, irgendwie bin ich drauf gekommen, als ich das gelesen habe:
ein selbstdefinierer InputStream, der per Zufall neue Zahlen erzeugt oder wartet,
Zuffal = Random, da hats klick gemacht :D
 
T

triopsfreak

Gast
Doch noch nicht ganz gelöst :(
Wie geht das nun, wenn die Dateien auf einem Server sind? RandomAccessFile geht dann nicht mehr, oder gibts da eine Möglichkeit? Und mit dem Socket hab ich einige Probleme, API lesen hat (noch) nichts gebracht, die Insel hilft mir auch nicht weiter... Wie muss das aussehen, damit ich das selbe machen kann wie vorhin, wenn die Datei auf einem anderen Server liegt? Helft mir bitte!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Eingabe des Users direkt hinter die Ausgabe Java Basics - Anfänger-Themen 3
Q Tastatureingabe direkt nach Eingabe (ohne zwischenzeitliches "Return" o.Ä ) weiterverwenden Java Basics - Anfänger-Themen 1
L Postleitzahl direkt nach Eingabe prüfen? Java Basics - Anfänger-Themen 7
G Ausführen und Eingabe direkt von der konsole Java Basics - Anfänger-Themen 6
Avalon Request direkt aus Eclipse wie bei Postman Java Basics - Anfänger-Themen 3
J GUI wird direkt nach dem erstellen weiß übermalt Java Basics - Anfänger-Themen 3
J Direkt studieren? Oder autodidaktisch lernen? Java Basics - Anfänger-Themen 20
P Zufälliges Wort direkt aus einer Liste ausgeben Java Basics - Anfänger-Themen 9
Z ArrayList direkt feste Größe mitgeben Java Basics - Anfänger-Themen 13
X Dateien direkt hintereinander schreiben, Dateiname Java Basics - Anfänger-Themen 25
A Vererbung Mit Casten direkt auf Sub-Klasse Zugreiffen Java Basics - Anfänger-Themen 6
J JDialog: wie kann ich ihn direkt als invisible erstellen Java Basics - Anfänger-Themen 7
S java tastendrücke direkt abfangen und printen Java Basics - Anfänger-Themen 3
J Objekte zur Laufzeit erzeugen und direkt verwenden Java Basics - Anfänger-Themen 9
S Direkt Instanzen anlegen Java Basics - Anfänger-Themen 1
G JTable: Werte in Tabelle direkt ansprechen Java Basics - Anfänger-Themen 3
D Direkt Klassen Initalisierung Java Basics - Anfänger-Themen 3
F Variablen Variable durch die direkt auf verschiede Objekte zugegriffen werden kann Java Basics - Anfänger-Themen 5
H Text ausdrucken, den ich entweder direkt in die Kommandozeile schreibe, oder über input redirect übe Java Basics - Anfänger-Themen 2
B Methoden Methode Direkt starten (über Kommandokonsole) Java Basics - Anfänger-Themen 5
P .class Datei direkt starten (optional Java Datei direkt starten) Java Basics - Anfänger-Themen 13
M Imports einzeln oder direkt komplette Pakete .*? Java Basics - Anfänger-Themen 26
M Compiler-Fehler Exceptions lieber throwen oder direkt catchen? Java Basics - Anfänger-Themen 8
P int Array direkt einer Funktion übergeben Java Basics - Anfänger-Themen 3
D Access Abfrage - Results direkt als Array erhalten Java Basics - Anfänger-Themen 2
D Javacode direkt in Betriebsystemabhängiges binary umwandeln Java Basics - Anfänger-Themen 5
D Ist es eigentlich ungünstig direkt in einem Konstruktor bereits umfangreichen Logikcode auszuführen? Java Basics - Anfänger-Themen 11
H jZable - Zelle direkt überschreiben Java Basics - Anfänger-Themen 3
B mit drawString direkt zeichnen, aber wie das Ende finden? Java Basics - Anfänger-Themen 3
K Datentypen Globale Variable direkt initialisieren oder im Konstruktor? Java Basics - Anfänger-Themen 13
U Von DB in Formular direkt oder über Objekt? Java Basics - Anfänger-Themen 2
babel Datenbank Daten direkt an die Tabelle übergeben ohne Arrays Java Basics - Anfänger-Themen 9
D strings wie "{{5.0,3.0},{1.0,2.0}}" direkt als dou Java Basics - Anfänger-Themen 6
B ActionListener direkt NACH einem anderen ausführen Java Basics - Anfänger-Themen 4
T Checkbox in jtable: boolean wert direkt setzen - wie? Java Basics - Anfänger-Themen 1
J Array: Jedem Element direkt denselben Wert zuweisen Java Basics - Anfänger-Themen 6
G Jar nicht direkt ausführbar Java Basics - Anfänger-Themen 6
N Bilder direkt in Jar einbinden Java Basics - Anfänger-Themen 7
W Double Werte von eine txt Datei direkt einlesen Java Basics - Anfänger-Themen 4
N Tastatur direkt einlesen (ohne Enter) Java Basics - Anfänger-Themen 3
K Reguläre Ausdrücke - Gefundene Tokens direkt ermitteln Java Basics - Anfänger-Themen 3
G jar direkt ausführen Java Basics - Anfänger-Themen 4
S paint() direkt auf JFrame seit 1.5 nicht mehr möglich? Java Basics - Anfänger-Themen 5
R OutputStream direkt in StringBuffer schreiben lassen Java Basics - Anfänger-Themen 2
Dilandau button direkt in applet hängen (ohne panel) Java Basics - Anfänger-Themen 2
S Klassen dynamisch direkt aus Dateien einbinden Java Basics - Anfänger-Themen 3
Torschti Eingabe von Dezimalzahlen (bis zu zwei Kommastellen) Java Basics - Anfänger-Themen 11
T User input in Verbindung mit ChronoUnit anpassen und falls falsche Eingabe getätigtwird Java Basics - Anfänger-Themen 7
T Eingabe durch eine Zahl dividieren nachgucken? Java Basics - Anfänger-Themen 4
T sortierung der eingabe nach größe Java Basics - Anfänger-Themen 5
Ostkreuz Int Scanner auf Enter Eingabe prüfen Java Basics - Anfänger-Themen 4
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
Jul1n4tor Scanner error bei Eingabe die kein Integer ist Java Basics - Anfänger-Themen 4
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
M Dialogbox sofort neustarten, falls aktuelle Eingabe falsch Java Basics - Anfänger-Themen 11
M Dialogbox solange abfragen, bis gültige Wert-Eingabe Java Basics - Anfänger-Themen 12
S OOP Java Eingabe in verschiedene Datenbank Tabellen eintragen Java Basics - Anfänger-Themen 7
A Bei VierGewinnt Eingabe per Buchstabe (a,b,c...) Java Basics - Anfänger-Themen 2
java-starter Erste Schritte Eingabe in Char wert umwandeln Java Basics - Anfänger-Themen 7
Lion.King Subtraktion nach Eingabe im Terminal Java Basics - Anfänger-Themen 7
X Erste Schritte Scanner eingabe wird übersprungen Java Basics - Anfänger-Themen 4
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
M Eingabe limit Java Basics - Anfänger-Themen 8
brypa Programm mit Eingabe Java Basics - Anfänger-Themen 129
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
D falsche eingabe erkennen Java Basics - Anfänger-Themen 2
H Eingabe tätigen bevor Graphics g Fenster öffnet Java Basics - Anfänger-Themen 5
H For-Schleife bis Index von Eingabe laufen lassen Java Basics - Anfänger-Themen 24
Hamudi Bachir 2D Array eingabe vom Benutzer Java Basics - Anfänger-Themen 31
S Warum erscheint bei mir "Hallo Welt" und nicht die aktuelle Eingabe? Java Basics - Anfänger-Themen 16
J Jtable Eingabe nach Klick ausserhalb der Tabelle übernehmen Java Basics - Anfänger-Themen 6
B Array bei jeder Eingabe um eins erweitern Java Basics - Anfänger-Themen 3
TimoN11 IntelliJ , Ausgabe von einem Quellcode in Eingabe eines Quellcodes Java Basics - Anfänger-Themen 1
M Nach einer erstmaligen Eingabe, eine zweite Eingabe nur noch gegen bestätigung möglich Java Basics - Anfänger-Themen 2
chocobear26 Interface JOptionPane - Dialog_Fenster zeigt immer vorherige Eingabe an. Java Basics - Anfänger-Themen 4
E JavaFX Taschenrechner Eingabe im Textfield beschränken Java Basics - Anfänger-Themen 2
M Regex nur Zahlen und Punkt zulassen, Keine Eingabe(Leeres TextFeld) nicht zulassen Java Basics - Anfänger-Themen 6
M JTextField nur Zahleneingaben zulassen, eingabe sperren Java Basics - Anfänger-Themen 24
E Timer trotz erwartender Eingabe durchlaufen lassen Java Basics - Anfänger-Themen 11
K falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
N Eingabe erkennen, ob groß oder kleingeschrieben worden ist Java Basics - Anfänger-Themen 22
N Fehlerausgabe bei falscher Eingabe der Users Java Basics - Anfänger-Themen 3
N Eingabe Kommazahlen über Scanner Java Basics - Anfänger-Themen 2
O Mehrfache Scanner-Eingabe durch Komma getrennt Java Basics - Anfänger-Themen 6
M String array durch Eingabe begrenzen Java Basics - Anfänger-Themen 7
iman Eingabe von Benutzer Filter machen. Java Basics - Anfänger-Themen 7
M Input/Output JTextField Eingabe in String Variable speichern Java Basics - Anfänger-Themen 15
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
M Verschiedene Eingabe = Verschiedene Ausgaben Java Basics - Anfänger-Themen 5
H Eingabe Java Basics - Anfänger-Themen 7
F Bedingung für Eingabe Java Basics - Anfänger-Themen 2
K Durch eine Text eingabe etwas Ausführen Java Basics - Anfänger-Themen 5
Dimax Erste Schritte String Eingabe Prüfen Java Basics - Anfänger-Themen 11
R Eingabe String umwandeln zu Integer Werten Java Basics - Anfänger-Themen 8
B Türme von Hanoi mit einer beliebigen aber gültigen Eingabe lösen Java Basics - Anfänger-Themen 5
D While Schleife bei Bedarf durch Eingabe stoppen Java Basics - Anfänger-Themen 15
J Eingabe Einschränken Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben