2016-03-23 1 views
0

Je reçois des données continues de ObjectInputStream que j'écris sur mon fichier en utilisant l'objet BufferedWriter. Je vérifie la taille du fichier qui ne cesse d'augmenter. Maintenant, dès que j'arrête d'arrêter la méthode while(true) avec false qui continue d'exécuter cette méthode, je ferme mon objet BufferedWriter. Après cette opération, toutes les données écrites dans le fichier sont perdues.Closing BufferedWriter efface toutes les données de fichier écrites dans le fichier?

private void appendFile(JLabel jLab0x28, Socket client) 
    { 
     try 
     { 
      if(!continueMe) 
      { 
       fileOut.close(); 
       fileOut = null; 
       in.close(); 
       System.gc(); 
       jLab0x28.setText("<html> <font color='red'> Socket is closed "+client.isClosed()+" </font> </html>"); 
       System.out.println("File size after discontinuing "+ 
         humanReadableByteCount(new File("C:\\ISSUE124_Resolved.txt").length(), true)); 
      } 

      if(!client.isClosed()) 
      { 
       try 
       { 
        String data = in.readObject().toString(); 
        System.out.println("File size is "+ 
          humanReadableByteCount(new File("C:\\ISSUE124_Resolved.txt").length(), true)); 
        fileOut.append(data); 
        fileOut.flush(); 
       } 
       catch (EOFException exp) 
       { 
        continueMe = true; 
        exp.printStackTrace(); 
        System.out.println("A Stream has finished "+exp.toString()+"\n"); 
       } 
       catch (ClassNotFoundException exp) 
       { 
        exp.printStackTrace(); 
        System.err.println(exp.toString()); 
        continueMe = false; 
       } 
      } 
     } 
     catch(IOException exp) 
     { 
      try 
      { 
       fileOut.close(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      exp.printStackTrace(); 
      System.err.println("Exception "+exp.toString()); 
      jLab0x28.setText(exp.getMessage()); 
      continueMe = false; 
     } 
    } 
public static String humanReadableByteCount(long bytes, boolean si) { 
     int unit = si ? 1000 : 1024; 
     if (bytes < unit) return bytes + " B"; 
     int exp = (int) (Math.log(bytes)/Math.log(unit)); 
     String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i"); 
     return String.format("%.1f %sB", bytes/Math.pow(unit, exp), pre); 
    } 

données enregistrées:

File size is 118.3 kB 
File size is 118.4 kB 
File size is 118.5 kB 
File size is 118.7 kB 
File size is 118.8 kB 
File size is 118.9 kB 
File size is 119.1 kB 
File size is 119.2 kB 
File size is 119.3 kB 
Done 
Closed Socket connection from client 
File size after discontinuing 0 B 
+1

si vous ne publiez pas de code 'humanReadableByteCount' est difficile de savoir ... –

+0

est juste un code qui renvoie la taille du fichier. Vérifiez la question mise à jour maintenant –

+0

Le code semble assez suspect aussi bien. Passer un 'Socket' comme paramètre comme ça ... ce n'est pas bon. – Kayaman

Répondre

1

Vous devez fermer la outputstream. vous faites actuellement que dans la clause catch qui n'est pas atteint si vous rencontrez pas IOException (et vous ne vous attendez pas)

catch(IOException exp) 
     { 
      try 
      { 
       fileOut.close(); 
      } 
    ... 

Modifier votre code comme celui-ci

catch(IOException exp) 
     { 

      exp.printStackTrace(); 
      System.err.println("Exception "+exp.toString()); 
      jLab0x28.setText(exp.getMessage()); 
      continueMe = false; 
     } 
try 
{ 
    fileOut.close(); 
} 
catch (IOException e) 
{ 
     e.printStackTrace(); 
    } 
+0

Oui mais ce sera aussi bon que de le mettre juste après avoir écrit une donnée comme fileOut.write (data); fileOut.flush(); fileOut.close(); ce qui me mènera à l'exception dès que la boucle continue. Je viens de le résoudre en utilisant FileWriter mais je suis toujours désireux de le comprendre. –

+0

Mettez 'fileOut.close()' après la boucle, quand vous n'écrirez plus ou puisque vous utilisez append vous pouvez ouvrir et fermer dans chaque itération de boucle, mais c'est beaucoup moins efficace –

+0

je l'ai fait, cela m'a donné java. io.IOException: Stream fermé –

0

Bon, ici, j'ai utilisé l'objet FileWriter en mémoire de BufferedWriter et maintenant mes données de fichier ne sont pas effacées. Tous les codes sont les mêmes, c'est juste un changement d'objet qui a fait l'affaire pour moi.

public static String humanReadableByteCount(long bytes, boolean si) { 
     int unit = si ? 1000 : 1024; 
     if (bytes < unit) return bytes + " B"; 
     int exp = (int) (Math.log(bytes)/Math.log(unit)); 
     String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i"); 
     return String.format("%.1f %sB", bytes/Math.pow(unit, exp), pre); 
    } 

    private void appendFile(JLabel jLab0x28, Socket client) 
    { 
     try 
     { 
      if(!continueMe) 
      { 
       //fileOut.close(); 
       //fileOut = null; 
       fw.close(); 
       fw = null; 
       in.close(); 
       System.gc(); 
       jLab0x28.setText("<html> <font color='red'> Socket is closed "+client.isClosed()+" </font> </html>"); 
       System.out.println("File size after discontinuing "+ 
         humanReadableByteCount(new File("C:\\ISSUE124_Resolved.txt").length(), true)); 
      } 

      if(!client.isClosed()) 
      { 
       try 
       { 
        String data = in.readObject().toString(); 
        System.out.println("File size is "+ 
          humanReadableByteCount(new File("C:\\ISSUE124_Resolved.txt").length(), true)); 
        fw.write(data); 
        fw.flush(); 
        //fileOut.write(data); 
        //fileOut.flush(); 

       } 
       catch (EOFException exp) 
       { 
        continueMe = true; 
        exp.printStackTrace(); 
        System.out.println("A Stream has finished "+exp.toString()+"\n"); 
       } 
       catch (ClassNotFoundException exp) 
       { 
        exp.printStackTrace(); 
        System.err.println(exp.toString()); 
        continueMe = false; 
       } 
      } 
     } 
     catch(IOException exp) 
     { 
      try 
      { 
       //fileOut.close(); 
       fw.close(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      exp.printStackTrace(); 
      System.err.println("Exception "+exp.toString()); 
      jLab0x28.setText(exp.getMessage()); 
      continueMe = false; 
     } 
    } 


File size is 1.8 MB 
File size is 1.8 MB 
File size is 1.8 MB 
Done 
Closed Socket connection from client 
File size after discontinuing 1.8 MB