2011-10-18 22 views
13

Şu anda sunucumdan bir JSON yanıtı almak için bir InpuStream kullanıyorum.2 kez kullanmam gerektiğinde kapalı bir InputStream'i nasıl yeniden açabilirim

  1. onu Ayrıştırma ve ekran
  2. kaydet bütün zaman en bana hiçbir sorunları verir sdcard dosyasında

bu yem değerleri gösteren:

Ben 2 şey yapmanız gerekir Bu 2 yöntemi tek tek kullanarak.

ayrıştırma GSON ile yapılır:

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

ve SDCard kopya yapılır İkisi test edilmiştir

FileOutputStream f (...) f.write (buffer) 

ile.

Sorun, ayrıştırma bittikten sonra SDCard'a yazmak istiyorum ve bozuluyor. Girişimcimin kapalı olduğunu anlıyorum ve sorun bu.

burada soruma yakın bir şey var: bu çözümü geliştirmek ve kullanabileceğimiz bir şeyler sunmak için bir yol How to Cache InputStream for Multiple Use

var mı?

cevap

26

Giriş akışını muhtemelen ByteArrayOutputStream kullanarak byte[] içine akıtır ve daha sonra akışı yeniden okumanın her zaman sonucuna göre yeni bir ByteArrayInputStream oluşturur.

Böyle bir şey:

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 ... 

İlgili ve muhtemelen yararlı, sorular ve cevaplar:

+0

thnx adam en iyi ile çağrı: yollu bunu başarmak için – Salman500

0

Alternatif olarak, bu büyük bulundu

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

Ve

CopyInputStream cis = new CopyInputStream(input); 
InputStream input1 = cis.getCopy();