Nacheinander folgende Strings in Textdokument auf neue Zeile schreiben

KeVoZ_

Aktives Mitglied
Hey Java-Community!

Ich habe vor kurzem eine Client-Server-Kommunikation gebastelt, in der der Client dem Server einen String zukommen lässt.
'Lauschen', Empfangen und Lesen habe ich wiefolgt gelöst:
Java:
while(true){
			Socket listen = server.accept();
			InputStreamReader PortLeser = new InputStreamReader(listen.getInputStream());
			BufferedReader eingabe = new BufferedReader(PortLeser);
			String s = eingabe.readLine();
			System.out.println("Client# " + s);
			logger(s /*+lineSeparator*/);   //Die Methode zum Verarbeiten des Strings - Dem Textdokument hinzufügen
}
Nun möchte ich den empfangenen String meiner log-Datei hinzufügen. Überlegt hatte ich mir, dass ich das Textdokument auslese, in einen String auslagere und anschließend mit dem frisch dazugekommenen String wieder einfüge. Bis zu diesem Punkt läuft alles ganz gut, nur möchte ich, dass die immer neu empfangenen Strings mit einem Zeilenumbruch in eine neue Zeile geschrieben werden(, und nicht wie im Moment, dass es einfach fortan auf der ersten Zeile geschrieben wird.)

Hier die "logger();" Methode:
Ich habe hier schon eigentlich überall versucht einen Zeilenumbruch einzubauen, allerdings werden dann nur der letzte empfangene String und der neue (auf zwei Zeilen) geschrieben.
Java:
@SuppressWarnings({"unused", "resource"})
	public static void logger(String logContent){
		
		String input = "";
		String line = "";
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(logFilePATH.toFile()));
			
			while((line = br.readLine()) != null) {
	               
	               input = line;
	               
	            }
			
		} catch (FileNotFoundException e) {
			System.out.println("Server# Die LogFile konnte nicht gefunden werden!");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("Server# Es ist ein Fehler während des Auslesens der LogFile aufgetreten!");
			e.printStackTrace();
		} finally {
            if(br != null) {
                try {
                    br.close();
                } catch(IOException e) {
                	System.out.println("Server# Es ist ein Fehler aufgetreten!");
                    e.printStackTrace();
                }
            }
        }
		
		
		try (FileOutputStream fos = new FileOutputStream(logFilePATH.toFile())) {
			
		     FileWriter fw = new FileWriter(logFilePATH.toFile());
		     BufferedWriter text = new BufferedWriter(fw);
		     
		     PrintWriter writer = new PrintWriter(logFilePATH.toFile());
		     
		     writer.write(input);
		     writer.append(logContent);
		     writer.close();
		     
		} catch (IOException e) {
			System.out.println("Server# Es ist ein Fehler während des Schreibens in die LogFile aufgetreten!");
			e.printStackTrace();
		}
	}

Wie kann ich mein oben beschriebenes Problem mittels diesem Aufbau lösen? Oder gibt es vielleicht einen anderen, möglicherweise einfacheren Weg zum Ziel zu kommen?

Vielen Dank an alle!
Mit freundlichen Grüßen
Kevin W.
 
Hast du schon mal die Methode BufferedWriter#newLine() probiert?
Diese erzeugt einen Zeilenumbruch in einer Textdatei.

Lg
 
@Robat Hey!
Jain. In die Datei schreibe ich mit dem PrintWriter. Wechsle ich zum schreiben zum BufferedWriter, wird mir ein Fehler in der IDE angezeigt. Nach meiner Logik müsste ich einen Zeilenumbruch beim Auslesen schon setzen, dass das beim Schreiben für jeden String einzeln mit übernommen wird. - Nur leider bekomm ich dann von allen nur noch 2 im Endeffekt raus.
 
meine logDatei besteht aus einem leeren Textdokument(log.txt).
Der Client schickt, je nach Gegebenheit, eine Nachricht, welche ich anschließend auf dem Server mithilfe eines BufferedReaders auslese und in einen String speichere:
Java:
InputStreamReader PortLeser = new InputStreamReader(listen.getInputStream());
BufferedReader eingabe = new BufferedReader(PortLeser);
String s = eingabe.readLine();
System.out.println("Client# " + s); //Auf dem Server (also im Screen) die Nachricht ausgeben. (Diese soll dann auch ins Textdokument geschrieben werden)
logger(s); //Methode zum Verarbeiten des Strings - In Textdokument schreiben --siehe unten

Den Text, der nun in dem String s gespeichert ist, übergebe ich nun der Methode logger();
Java:
@SuppressWarnings({"unused", "resource"})
	public static void logger(String logContent){ //LogContent entspricht dem Text, welchen ich in String s gespeichert habe
		
		String input = "";
		String line = "";
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(logFilePATH.toFile())); //Ich lese den bereits vorhandenen Text der log.txt aus...
			
			while((line = br.readLine()) != null) {//...so viel bzw. lange, bis ich jede Zeile habe...
	               
	               input = line;//...und speichere das in den String input.
	               
	            }
			
		} catch (FileNotFoundException e) {
			System.out.println("Server# Die LogFile konnte nicht gefunden werden!");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("Server# Es ist ein Fehler während des Auslesens der LogFile aufgetreten!");
			e.printStackTrace();
		} finally {
            if(br != null) {
                try {
                    br.close();
                } catch(IOException e) {
                	System.out.println("Server# Es ist ein Fehler aufgetreten!");
                    e.printStackTrace();
                }
            }
        }
		
		
		try (FileOutputStream fos = new FileOutputStream(logFilePATH.toFile())) {
		     
		     PrintWriter writer = new PrintWriter(logFilePATH.toFile()); //Nun schreibe ich das Textdokument neu:
		     
		     writer.write(input); //Einmal mit dem, was schon drinnen stand...
		     writer.append(logContent); //...und dem, was mit dem String s neu dazugekommen ist.
		     writer.close();
		     
		} catch (IOException e) {
			System.out.println("Server# Es ist ein Fehler während des Schreibens in die LogFile aufgetreten!");
			e.printStackTrace();
		}
	}
Ich hab' das jetzt mal im Code kommentiert, was ich bezwecken will. Ich hoffe das ist verständlich, ansonsten einfach fragen 😉
 
writer.write(input); //Einmal mit dem, was schon drinnen stand...
writer.append(logContent); //...und dem, was mit dem String s neu dazugekommen ist.
writer.close();

Also dein newLine muss auf jeden Fall hier rein.
Immer zwischen write(input) und append.

Ich weiß nicht wie du bis jetzt den Zeilenumbruch hervorgerufen hast.. aber:

PrintWriter.println() generiert ein Zeilenumbruch OS-Abhängig.
Bedeutet bei Unix Systemen wird es mit LF (\n) generiert und bei Windoof mit CR+LF (\r\n).

Du könntest jetzt - je nach dem - immer schreiben:
writer.print("..." + "\r\n") // oder eben nur \n

Oder du nimmst den sicheren Weg über System.getProperty("line.seperator");

BTW:

while((line = br.readLine()) != null)
{//...so viel bzw. lange, bis ich jede Zeile habe...

input = line;//...und speichere das in den String input.

}

Du überschreibst dein Input immer. Du solltest den Text aber anhängen! input += line


Lg
 
Hey @Robat!
Vielen Dank!
Das entscheidende Problem war das input += line!

Das Schreiben an sich bleibt, dort musste ich keinen Zeilenumbruch einbauen.
Java:
writer.write(input);
writer.append(logContent);
writer.close();

Mit jeder line, welche ich hinzufüge, füge ich auch einen Zeilenumbruch hinzu.
Java:
input += line + lineSeparator;


Vielen Dank für Deine super Hilfe!
Mit freundlichen Grüßen!
Kevin Wilde
 

Zurück
Oben