Java:为什么for循环和while循环之间的内存使用有差异?

Cht*_*ect -3 java memory loops java-8

我正在读取XML文件并将其内容推送到ByteArrayOutputStream如下所示:

static final MY_XML_FILE = new File("...");

byte[] buffer = new byte[(int) MY_XML_FILE.length()];
    int bytesRead;
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    while ((bytesRead = fileInputStream.read(buffer)) != -1)
        output.write(buffer, 0, bytesRead);
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.

我不喜欢在-loop bytesRead之外可见的范围while,所以我把它改成了for-loop:

for (int bytesRead = fileInputStream.read(buffer); bytesRead != -1; )
    output.write(buffer, 0, bytesRead);
Run Code Online (Sandbox Code Playgroud)

但是这会引发以下错误:

java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    at java.util.Arrays.copyOf(Arrays.java:3236)
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)
Run Code Online (Sandbox Code Playgroud)

我的问题是:两种循环方式不一样吗?如果没有,那么我想知道Java中的内存使用情况forwhile循环是如何不同的.

clc*_*cto 7

在你的for循环中,你只设置bytesRead一次,而不是像你一样设置每次迭代while.for你的while循环的等价是:

for( int bytesRead; (bytesRead = fileInputStream.read(buffer)) != -1; )
Run Code Online (Sandbox Code Playgroud)

或者以不同的方式:

for( int bytesRead = fileInputStream.read(buffer); bytesRead != -1; bytesRead = fileInputStream.read(buffer) )
Run Code Online (Sandbox Code Playgroud)