Подтвердить что ты не робот

Как я могу открыть закрытый 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 для множественного использования

Есть ли способ улучшить это решение и предоставить что-то, что мы можем использовать?

4b9b3361

Ответ 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();