Как я могу открыть закрытый InputStream, когда мне нужно использовать его 2 раза - PullRequest
16 голосов
/ 18 октября 2011

В настоящее время я использую InpuStream для получения ответа JSON от моего сервера.

Мне нужно сделать 2 вещи с:

  1. Разбор и отображение значений на экране
  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)

Оба они были проверены.

TY проблема в том, что когда синтаксический анализ завершен, я хочу записать на SDCard, и он ломается. Я понимаю, что мой InputStream закрыт, и это проблема.

Здесь есть что-то похожее на мой вопрос: Как кэшировать InputStream для многократного использования

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

Ответы [ 2 ]

28 голосов
/ 18 октября 2011

Я бы, вероятно, опустошил входной поток в 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 ...

Связанные и, возможно, полезные вопросы и ответы:

0 голосов
/ 18 октября 2011

В качестве альтернативы я нашел отличный способ добиться этого:

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();
...