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中的内存使用情况for和while循环是如何不同的.
在你的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)