2015-10-28 13 views
5

Sunucudaki bir veritabanını indirmek ve Android uygulamamda kopyalamak için OkHttpClient kullanıyorum, istek tamam ve iyi içeriği aldım.Android OkHttp InputStream java.IOException.closed

Ancak, dosyama byteStream yazmayı denediğimde java.IOException.closed aldım. Neyi yanlış yaptığımı biliyor musun?

Response httpResponse = webApiClient.execute(
    new WebApiRequest(WebApiMethod.DB_DOWNLOAD), context); 

if (httpResponse.code() == 200) 
{ 
    try 
    { 
     InputStream inputStream = httpResponse.body().byteStream(); 
     File databasePath = context.getDatabasePath(Constant.DATABASE_NAME); 
     FileOutputStream output = new FileOutputStream(databasePath); 
     int bufferSize = 1024; 
     byte[] buffer = new byte[bufferSize]; 
     int len; 
     while ((len = inputStream.read(buffer)) != -1) 
     { 
      output.write(buffer, 0, len); 
     } 
     success = true; 
    } 
    catch (Exception exc) 
    { 
     Utils.DisplayException(exc, context); 
    } 
} 

Ben de okumaya çalıştım benim ile ByteStream bir BufferedSink ama sonuç aynı

BufferedSink sink = Okio.buffer(Okio.sink(databasePath)); 
sink.writeAll(httpResponse.body().source()); 
sink.close(); 

StackTrace oldu: akışı neden kapatıldığı

java.io.IOException: closed 
    at okio.RealBufferedSource$1.read(RealBufferedSource.java:367) 
    at java.io.InputStream.read(InputStream.java:162) 
    at com.org.dbconn.LoginActivity$DbDownloadTask.doInBackground(LoginActivity.java:475) 
    at com.org.dbconn.LoginActivity$DbDownloadTask.doInBackground(LoginActivity.java:436) 
    at android.os.AsyncTask$2.call(AsyncTask.java:288) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:818) 
+1

Tam yığın izinizi gönderebilir misiniz lütfen? – apmartin1991

+1

Akışı kapatabilecek herhangi bir engelleyici kullanıyor musunuz? –

cevap

3

bazı test için, bulmak Çıktı dizgisinin içeriğini bir System.out.println ile kontrol ediyordum, ancak çıktıyı okuduğunuzda veya yazdırdığınızda, akışı otomatik olarak kapattığım için bu yüzden bir hata.

Sonuç olarak, Akışla ilgili hatırlanması gereken bir şey: outputStream'i okumak veya yazdırmak onu kapatacaktır.