Не могу понять почему выходит ошибка в коде, тема InputStream и OutputStream
всем хорошего дня! Подскажите, пожалуйста, в чем ошибка в данном коде.
Выходит ошибка: выходной поток оказался пуст, когда этого не ожидалось.
Задание состоит в следующем: Напишите метод void print(InputStream inputStream, OutputStream outputStream) который принимает InputStream и OutputStream, считывает все байты из inputStream и записывает в OutputStream только четные.
Пример ввода: 3, 10, 4, 5, 7
Пример вывода: 10, 4
Мой код:
public class Test {
public static void main(String[] args) throws IOException {
InputStream stream = new ByteArrayInputStream(new byte[]{2, -11, 7, 51, 64});
OutputStream outputStream = new ByteArrayOutputStream();
print(stream, outputStream);
}
public static void print(InputStream inputStream, OutputStream outputStream) throws IOException {
byte result;
int i;
while ((i = inputStream.read()) != -1) {
if ((result = (byte) i) % 2 == 0) {
outputStream.write(result);
}
}
}
}
Ответы (2 шт):
Резюмирую комментарии: Проблема в том, что вы неправильно работаете с IO.
Проблема в задании с тем, что внутри ByteArrayOutputStream зашит буфер, который после записи необходимо "прочищать" с помощью метода flush(), чтобы не потерять еще не записанную информацию.
Вторая проблема в том, что вы не закрываете потоки записи и чтения, что в случае с чтением/записью из массива не ведет к каким-то губительными последствиям, но в общем случае лучше использовать конструкцию try-with-resources, так вы освободитье себя от необходимости самому освобождать ресурсы и делать flush(), все выполнится автоматически после выхода из блока try.
public static void print(InputStream inputStream, OutputStream outputStream) throws IOException {
int len = inputStream.read();
int i =0;
while (len != -1) {
if (len % 2 == 0) {
System.out.println(len);
outputStream.write(len);
outputStream.flush();
}
len = inputStream.read();
}
}