Как мога да отворя отново затворен InputStream, когато трябва да го използвам 2 пъти

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

Трябва да направя 2 неща с:

  1. Анализира го и показва стойностите на екрана
  2. Запазете тази емисия на SDCard файл

Това изобщо не ми създава проблеми, когато използвам тези 2 метода един по един.

Анализът е направен с 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 за многократна употреба

Има ли начин да подобрим това решение и да предоставим нещо, което можем да използваме?


person Waza_Be    schedule 18.10.2011    source източник


Отговори (2)


Вероятно бих източил входния поток в 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 ...

Свързани и вероятно полезни въпроси и отговори:

person aioobe    schedule 18.10.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();
person Waza_Be    schedule 18.10.2011