Я читаю файл XML и толкая его содержимое в ByteArrayOutputStream
следующим образом:Java: почему существует разница в использовании памяти между циклами for- и while?
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);
, который прекрасно работает.
Я не хотел сферу bytesRead
быть виден снаружи while
-loop, поэтому я изменил его на for
-loop:
for (int bytesRead = fileInputStream.read(buffer); bytesRead != -1;)
output.write(buffer, 0, bytesRead);
Но это выдает следующее сообщение об ошибке:
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)
Вопрос в том, должны ли два способа зацикливания не совпадать? Если нет, то я хотел бы знать, как петли и while
отличаются в использовании памяти в Java.
см. 1 в условии цикла: for (int bytesRead = fileInputStream. read (buffer); bytesRead! = 1;) – rafalopez79
Похоже, ваше состояние изменяется от «! = -1» до «! = 1»? –
Спасибо, что указали это. Исправлена опечатка. –