java 重新分配ByteArrayOutputStream行为

5ktev3wc  于 2023-09-29  发布在  Java
关注(0)|答案(2)|浏览(109)

我在使用ByteArrayOutputStream写入文件时遇到内存错误。代码如下:

ByteArrayOutputStream data = getNewData();

while (data.size() > 0) {
    try (OutputStream outputStream = new FileOutputStream("data.txt", true)) {
        data.writeTo(outputStream);
    } catch (IOException ex) {
        throw new RuntimeException(ex);
    }

    data = getNewData();
}

我怀疑重新分配变量data不会以某种方式清除旧值,但我不知道如何证明这一点,因为理论上垃圾收集器应该删除旧值。我想我漏掉了什么...

vof42yt1

vof42yt11#

一旦data被重新分配,垃圾收集器将清理旧的ByteArrayOutputStream。但是这种重新分配只有在getNewData()返回时才会发生。当getNewData()运行时,内存中将有旧的ByteArrayOutputStream(由data引用)和新的ByteArrayOutputStream(可能是在getNewData()中创建的)。
您可以提前取消引用旧的ByteArrayOutputStream

ByteArrayOutputStream data = getNewData();

while (data.size() > 0) {
    try (OutputStream outputStream = new FileOutputStream("data.txt", true)) {
        data.writeTo(outputStream);
    } catch (IOException ex) {
        throw new RuntimeException(ex);
    }

    data = null;    
    data = getNewData();
}
zujrkrfu

zujrkrfu2#

  • "...我在使用ByteArrayOutputStream写入文件时遇到内存错误。..."*

尝试使用 * 字节数组 *。
这里有一个例子。

ByteArrayInputStream is = getNewData();
try (FileOutputStream os = new FileOutputStream("data.txt", true)) {
    int n;
    byte[] b = new byte[1000];
    while ((n = is.read(b)) != -1) os.write(b, 0, n);
}
  • "...我怀疑重新分配变量data不会以某种方式清除旧值,但我不知道如何证明这一点,因为理论上垃圾收集器应该删除旧值。..."*

变量赋值将丢弃之前的任何值,按照 Java 语法。

相关问题