当我需要使用它2次时,如何重新打开已关闭的InputStream

时间:2011-10-18 09:42:59

标签: java android inputstream

我目前正在使用InpuStream从我的服务器获取JSON响应。

我需要做两件事:

  1. 解析并在屏幕上显示值
  2. 将此Feed保存在SDCard文件
  3. 在逐个使用这两种方法时,这完全没有问题。

    使用GSON进行解析:

    Gson gson = new Gson();
    Reader reader = new InputStreamReader (myInputStream);
    Result result = gson.FrmJson(reader, Result.class)
    

    并使用

    复制到SDCard
    FileOutputStream f (...) f.write (buffer)
    

    两者都经过测试。

    TYhe问题是解析完成后,我想写入SDCard并且它会中断。 我知道我的InputStream已关闭,这就是问题所在。

    我的问题附近有一些问题:How to Cache InputStream for Multiple Use

    有没有办法改进该解决方案并提供我们可以使用的东西?

2 个答案:

答案 0 :(得分:28)

我可能会使用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 ...

相关且可能有用的问题和答案:

答案 1 :(得分:0)

或者,我找到了实现它的好方法:

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