2016-05-02 2 views
1

Ich habe nach einem Problem mit .close() gesucht, das zu Problemen beim Abschneiden geführt hat. Das Programm läuft auf zwei verschiedenen Servern, hatte aber das gleiche Cutoff-Problem. Es scheint, dass die Protokolldatei nicht ordnungsgemäß gelöscht wird. Also entschied ich mich, in den .close() Quellcode einzutauchen. Ich sehe kein .flush() genannt werden. Fehle ich etwas? Sollten wir immer .flush() anrufen? Nach dieser Antwort, sollte es keine Rolle: Using flush() before close()Der Aufruf von close() auf OutputStream unterbricht die Ausgabe in eine Protokolldatei.

Was ich rufe:

private static void write_to_file(String incoming){ 
    output_stream.write(incoming); 
    output_stream.write(System.lineSeparator()); 
    } 

Später Ich nenne output_stream.close();

Der Quellcode:

/** 
* Closes the stream and releases any system resources associated 
* with it. Closing a previously closed stream has no effect. 
* 
* @see #checkError() 
*/ 
public void close() { 
    try { 
     synchronized (lock) { 
      if (out == null) 
       return; 
      out.close(); 
      out = null; 
     } 
    } 
    catch (IOException x) { 
     trouble = true; 
    } 
} 

Log Datei:

C:\apps\bot\log\processed\file.0000090.gz 
C:\apps\bot\log\processed\file.0000091.gz 
C:\apps\bot\log\process 
+0

Die Verwendung von 'close()' sollte alles sein, was Sie brauchen. Wie erstellst du den Stream, an den du schreibst? Sind Sie absolut sicher, dass Ihre Methode 'close()' aufgerufen wird? – Mifeet

+0

Weißt du was, ich hatte das gerade überprüft und gesehen, dass es nur in einem try-catch-Block ausgeführt wurde (bei jeder Ausnahme). Bitte hinterlassen Sie eine Antwort und ich werde korrekt markieren. Vielen Dank – Petro

Antwort

2

Wie in den question angegeben Sie ganz richtig gesagt haben, close() auf einem Stream Aufruf ist genug, was Sie in den Stream zu spülen geschrieben habe. Wenn die Ausgabe abgeschnitten wird, gibt es ein paar typischen Fehler:

  • Ihre close() Methoden nicht aufgerufen wird, zum Beispiel wenn Sie steckt es in einem catch Block statt finally;)

  • Aufruf close() auf einem benutzerdefinierten Strom nicht den Anruf an den zugrunde liegenden Stream nicht ausbreiten.

  • Das Problem kann auch bei der Codierung auftreten, wenn Sie Ihre Zeichenfolge nicht richtig in Bytes konvertieren.

Verwandte Themen