Как я могу открыть закрытый InputStream, когда мне нужно его использовать 2 раза
В настоящее время я использую InpuStream для получения ответа JSON с моего сервера.
Мне нужно сделать 2 вещи с помощью:
- Разбор и отображение значений на экране
- Сохранить этот канал в файле SDCard
Это не дает мне никаких проблем при использовании этих двух методов один за другим.
Разбор выполняется с помощью GSON:
Gson gson = new Gson();
Reader reader = new InputStreamReader (myInputStream);
Result result = gson.FrmJson(reader, Result.class)
и копия на SDCard производится с помощью
FileOutputStream f (...) f.write (buffer)
Оба они были протестированы.
Проблема заключается в том, как раз разбор выполняется, я хочу писать на SDCard, и он ломается.
Я понимаю, что мой InputStream закрыт, и проблема.
В моем вопросе есть что-то близкое: Как кэшировать InputStream для множественного использования
Есть ли способ улучшить это решение и предоставить что-то, что мы можем использовать?
Ответы
Ответ 1
Я бы, вероятно, спустил поток ввода в byte[]
с помощью ByteArrayOutputStream
, а затем создаст новый ByteArrayInputStream
на основе результата каждый раз, когда мне нужно перечитать поток.
Что-то вроде этого:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n = 0;
while ((n = myInputStream.read(buf)) >= 0)
baos.write(buf, 0, n);
byte[] content = baos.toByteArray();
InputStream is1 = new ByteArrayInputStream(content);
... use is1 ...
InputStream is2 = new ByteArrayInputStream(content);
... use is2 ...
Связанные и, возможно, полезные вопросы и ответы:
Ответ 2
В качестве альтернативы я нашел этот отличный способ добиться этого:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class CopyInputStream
{
private InputStream _is;
private ByteArrayOutputStream _copy = new ByteArrayOutputStream();
/**
*
*/
public CopyInputStream(InputStream is)
{
_is = is;
try
{
copy();
}
catch(IOException ex)
{
// do nothing
}
}
private int copy() throws IOException
{
int read = 0;
int chunk = 0;
byte[] data = new byte[256];
while(-1 != (chunk = _is.read(data)))
{
read += data.length;
_copy.write(data, 0, chunk);
}
return read;
}
public InputStream getCopy()
{
return (InputStream)new ByteArrayInputStream(_copy.toByteArray());
}
}
И я называю это
CopyInputStream cis = new CopyInputStream(input);
InputStream input1 = cis.getCopy();