FileWriter会不会造成内存不足?

躺者如C
  • 3
新手上路,请多包涵

由于FileWriter底层是用FileOutputStream实现的,我在做一个txt文件拷贝的小案例中采用如下代码:

public class FileWriterLearning {
    public static void main(String[] args) {
        String filePath = "D:\\IdeaProjects\\IOStreamLearning\\assets\\test.txt";
        String targetPath = "D:\\IdeaProjects\\IOStreamLearning\\assets\\test_copy.txt";
        FileWriter fileWriter = null;
        FileReader fileReader = null;
        try {
            fileReader = new FileReader(filePath);
            fileWriter = new FileWriter(targetPath,true);

            char[] buffer = new char[16];
            int readLen = 0;
            while ((readLen = fileReader.read(buffer)) != -1) {
                fileWriter.write(buffer,0,readLen);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                // 本质不是还是全读到内存再整体写入吗,那上面边读边写也无法保证内存的问题
                fileReader.close();
                fileWriter.close();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

代码中我采取了边读边写的方案防止文件过大一次性读取会造成内存不足,但我看了FileWriter.close()发现,FileWriter会在close()时才真正开始写入,如下图(本质是使用了FileOutputStream.write()写入),而刚才分批读入的数据全都存储在bb.hb这个字节数组中,即文件的数据最后还是全部存到了内存中,假如文件过大可能还是会造成内存不足,所以边读边写防止文件数据全部读入内存是没用的吗?如果真是这样,处理大文件的读写有什么解决方案呢?
image.png

回复
阅读 402
2 个回答
kamier
  • 175
✓ 已被采纳

FileWriter内部使用了缓冲区,上图里的bb就是缓冲区,内部hb是一个8k大小的字节数组,调用FileWriter.write方法时是先往缓冲区里写,当缓冲区写满时,内部会自己去调用OutputStream的write方法写入到文件中,所以完全不需要担心内存不足的问题

如果想要每次读完数据后,直接写入文件,可以在write之后调用flush或flushBuffer,将缓冲区里的数据直接冲出写入到文件中

可以在每次write 后调用 flush() 或者 flushBuffer()方法即可

宣传栏