什么是缓冲式打字机close()& amp;的记忆效应。 flush()方法?

时间:2011-12-05 13:32:47

标签: java memory flush bufferedwriter

我在这里很困惑。我正在准备SCJP,我写了一个小的递归来检查BufferedWriter内存分配之后|在flush()&之后close()方法。请参阅下面的代码块,我刚刚将我的桌面文件写入文本文件。

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);

            }
        }
    }
}

输出很好,但我不明白,之前的免费记忆比flush()& close()与flush之后相同()& close()。请看我的输出:

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

我检查了现有主题,但我找不到确切的解释。我期待在bw.close()之后我会有更多的可用内存。

谢谢

2 个答案:

答案 0 :(得分:4)

关闭和刷新流与“清理内存”无关,它们确保将BufferedStream中的数据刷新到流指向的任何内容,例如通常是磁盘或网络套接字。阅读JavaDoc,它永远不会暗示这有任何事情要做,或者无论如何影响垃圾收集。在浪费资金进行无价值的认证之前,你需要回去学习。

答案 1 :(得分:1)

仅在垃圾收集器运行后才清理内存。在此之前,您不会看到内存消耗的任何变化。