2016-07-27 10 views
0

Ich habe ein Problem mit dem Schreiben von eingehenden Informationen von einem Client zu diesem Programm. Die Daten kommen herein und es wird jede Sekunde von der System.out ausgegeben, aber der FileWriter druckt nur die erste Ausgabezeile ab, als das Programm gestartet wurde. Ich stoppe das Programm manuell und überprüfe die Datei danach. Ich bin mir nicht sicher, was falsch ist, bitte hilf mir.FileWriter schreibt nur die erste Zeile (Append Mode enabled, Java)

import javax.swing.*; 
import java.awt.event.KeyEvent; 
import java.net.*; 
import java.io.*; 
import java.sql.SQLException; 
import java.time.LocalDate; 
import java.time.LocalDateTime; 
import java.time.LocalTime; 

public class Server { 



    public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException { 

     String msg_received; 
     FileWriter fw = new FileWriter("HeartData.txt", true); 
     BufferedWriter bw = new BufferedWriter(fw); 
     PrintWriter out = new PrintWriter(bw); 
     System.out.println("Waiting for Android client to connect..."); 


      while (true) 
      { 

       try 
       { 
        ServerSocket server = new ServerSocket(2323); 
        Socket s = server.accept(); 
        server.close(); 
        InetAddress clientAddress = s.getInetAddress(); 
        System.out.println("Incoming connection from: " + clientAddress.getHostName() + "[" + clientAddress.getHostAddress() + "]"); 

        DataInputStream DIS = new DataInputStream(s.getInputStream()); 
        msg_received = DIS.readUTF(); 
        out.println(msg_received + "," + LocalTime.now() + "," + LocalDate.now()); 
        System.out.printf("Android says: %sat %s%n", msg_received, LocalTime.now()); 
       } 
       catch (IOException e){e.printStackTrace();} 
       finally { 
          out.close(); 
         } 
      } 



      } 
} 

Ausgabe:

für Android-Client Warten ...

Ankommende Verbindung von verbinden: hostname.domain [ipaddress] Android sagt: ETWAS bei 10: 51: 06,013

+0

Bitte nehmen Sie sich etwas Zeit, um Ihren Code lesbarer zu formatieren. Ziehen Sie die mehreren gleichzeitigen Leerzeilen ab und stellen Sie sicher, dass alles idiomatisch eingerückt ist. –

+0

Danke für die Rückmeldung, wie lesbar ist es jetzt? –

+0

Nicht wirklich - schauen Sie sich die Einrückung von 'System.out.println' gegenüber der' while' Schleife an, sowie die mehreren leeren Zeilen am Ende und die vertikalen Klammern, die vertikal ausgerichtet sind, wo einer von ihnen ausgegraben werden soll. Ihre IDE sollte Ihnen helfen, den Code sehr einfach zu formatieren. –

Antwort

3

Sie haben folgende Struktur:

while (true) { 
    try { 
     // Code which writes one line 
    } finallly { 
     out.close(); 
    } 
} 

Mit anderen Worten, Sie schließen die Ausgabe nach der ersten Zeile, aber weiterhin zu arbeiten. Das wird die Ausgabe nicht wieder öffnen ...

Sie sollten wirklich einen try-with-resource-Block für die ganze Sache verwenden, mit der while-Schleife ganz innerhalb es, so dass Sie den Schreiber nicht bis schließen Deine ganze Schleife ist beendet. (Zugegeben, im Moment kann es nur wegen einer Ausnahme beendet werden ... möchten Sie vielleicht eine nicht außergewöhnliche Möglichkeit hinzufügen, die Schleife zu stoppen ...)

+0

Danke für die schnelle Rückmeldung! Das Ändern von einer Try-mit-Ressource zu dieser Struktur war tatsächlich ein Teil von dem, was ich versuchte, und dann wurde mir klar, was du über die while-Schleife gesagt hast; Es endet nicht, daher kann ich die Datei nicht richtig schließen. Ich brauche eine bessere Code-Struktur, also bin ich zu allen Vorschlägen bereit. Danke, dass du mir geholfen hast, genau zu sehen, was falsch ist! –