2011-12-05 6 views
1

私はここでかなり混乱しています。私はSCJPの準備をしていますが、flush()& close()メソッドの前に、BufferedWriterのメモリ割り当てをチェックするための小さな再帰的な書き込みを書きました。以下のコードブロックを参照してください、私はちょうど私のデスクトップファイルをテキストファイルに書きました。bufferedwriter close()&flush()メソッドのメモリ効果とは何ですか?

import java.io.*; 

public class Myexception{ 

    private static String lvl = ""; 
    static BufferedWriter bw; 
    private static File source = new File("C:\\Users\\"+System.getProperty("user.name")+"\\Desktop\\New folder\\myTest.txt"); 

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

     Runtime rt = Runtime.getRuntime(); 

     System.out.println("Free memory before recursive: " + rt.freeMemory()); 

     bw = new BufferedWriter(new FileWriter(source)); 

     checkFiles(new File("C:\\Users\\"+System.getProperty("user.name")+"\\Desktop"), 0); 

     System.out.println("Memory after recursive: " + rt.freeMemory()); 

     bw.flush(); 
     bw.close(); 
     lvl = null; 

     System.out.println("Memory after clean up: " + rt.freeMemory()); 
    } 
    static void checkFiles(File file, int level) throws IOException{ 

     if(!file.exists()){ 

      System.out.println("File doesnt exist: " + file.getName() + file.getPath()); 
      return; 
     } 

     for(String s:file.list()){ 

      if(new File(file.getPath() + "\\" + s).isDirectory()){ 

       bw.newLine(); 
       bw.write(lvl + "Directory: " + s); 

       lvl += " "; 

       checkFiles(new File(file.getPath() + "\\" + s), level+1); 

      }else{ 

       bw.newLine(); 
       bw.write(lvl + "File: " + s); 

      } 
     } 
    } 
} 

(出力は結構ですが、私は理解していませんでし何を、フラッシュよりも前に、空きメモリ)&近い()(フラッシュよりも後と同じである)&近い()私の出力を参照してください。

Free memory before recursive: 126150232 
Memory after recursive: 104461304 
Memory after clean up: 104461304 

私は既存のトピックをチェックしましたが、正確な説明を見つけることができませんでした。私はbw.close()の後に空きメモリが増えることを期待していました。

は、「メモリをクリーンアップ」とは何の関係もありません、彼らはBufferedStream内のデータは、例えばディスクやネットワークソケット、ストリームが指しているものは何でもにフラッシュされていることを確認してくださいあなたに

+0

もっと大きな文章を書くようにしてください。 1つのチャンク内のファイルに書き込めないもの – LazyCubicleMonkey

答えて

1

ガベージコレクタの実行後にのみメモリがクリーニングされます。それまでは、メモリ消費量の変化は見られません。

+0

GCの後にニッケムさんありがとうございました別の結果がありました – HRgiger

4

決算フラッシングストリームをありがとう通常。 JavaDocを読んでも、これは、これが、何とかガベージコレクションに何か影響を及ぼしたり影響を与えたりすることを意味していません。無価値な証明書であなたのお金を無駄にする前に、勉強に戻る必要があります。

+2

+1:フラッシュして閉じ、バッファされたデータがOSに書き込まれるようにします。 –

+0

@Jarrod答えをありがとう、私は彼らがバッファリングされたデータがディスクに書き込まれていることを確認していることを知っていることを言及することを忘れないでください。質問のトピックとして、私は彼らが記憶にも影響を与えるかどうか疑問に思っていました。ここhttp://www.coderanch.com/t/550351/Streams/java/Why-must-we-close-BufferedWriter私はいくつかのgcのコメントを読む。説明のため+1。 – HRgiger

関連する問題