2011-09-14 6 views
3

WebからローカルのAndroid携帯に画像をロードしています。ファイルに書き込むためのコードは、次のとおりです。BufferedInputStreamをファイルに変換する

 BufferedInputStream bisMBImage=null; 
     InputStream isImage = null; 
     URL urlImage = null; 
     URLConnection urlImageCon = null; 
     try 
     { 
       urlImage = new URL(imageURL); //you can write here any link 
       urlImageCon = urlImage.openConnection(); 
       isImage = urlImageCon.getInputStream(); 
       bisMBImage = new BufferedInputStream(isImage); 

       int dotPos = imageURL.lastIndexOf("."); 
       if (dotPos > 0) 
       { 
        imageExt = imageURL.substring(dotPos,imageURL.length());  
       } 

       imageFileName = PATH + "t1" + imageExt; 
       File file = new File(imageFileName); 
       if (file.exists()) 
       { 
        file.delete(); 
        Log.d("FD",imageFileName + " deleted"); 
       } 
       ByteArrayBuffer baf = new ByteArrayBuffer(255); 
       Log.d("IMAGEWRITE", "Start to write image to Disk"); 
       int current = 0; 
       try 
       { 
        while ((current = bisMBImage.read()) != -1) 
        { 
          baf.append((byte) current); 
        } 

        FileOutputStream fos = new FileOutputStream(file); 
        fos.write(baf.toByteArray()); 
        fos.close();  
        Log.d("IMAGEWRITE", "Image write to Disk done"); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       }      

       isImage.close(); 
     } 
     catch (IOException e) 
     { 
       Log.d("DownloadImage", "Error: " + e); 
     } 
     finally 
     { 
      isImage = null;   
      urlImageCon = null; 
      urlImage = null; 
     } 

何らかの理由で、ファイルへの書き込み全体に1分かかります。私はこれを最適化する方法はありますか?

+0

大きな画像ですか? – Otra

+0

オトラが尋ねるものに似ています - イメージはどれくらい大きいですか?また、あなたはこの質問に 'android-emulator'タグを入れています。エミュレータは特定のものについては遅くなるかもしれませんが、私はそれを使用しないので、ファイルのダウンロード/書き込みが含まれているかわかりません。実際のデバイスでこれを試して、どれくらい時間がかかるか見てみましたか? – Squonk

+0

これはメインのUIスレッドまたは別のスレッドで実行されていますか? – WindsurferOak

答えて

2

バッファが非常に小さい:255バイト。あなたはそれを1024倍大きくすることができます(255キロバイト)。これは容認できるサイズであり、これは確かに事をスピードアップするでしょう。それはバイトずつ読み込むよう

また、これは非常に遅いです:あなたが使用してみてください

while ((current = bisMBImage.read()) != -1) { 
    baf.append((byte) current); 
} 

array version of read()代わりに:私は、上記したものと同じ大きさの配列を持つread(byte[] buffer, int offset, int byteCount)

2

java URL接続経由でファイルを取得するには、Android HttpClientを使用する必要があります。また、あなたのバッファは非常に小さいです。 これを試してみてください:

FileOutputStream f = new FileOutputStream(new File(root,"yourfile.dat")); 

DefaultHttpClient httpClient = new DefaultHttpClient(); 
HttpGet request = new HttpGet(urlString); 
HttpResponse response = httpClient.execute(request); 
InputStream is = response.getEntity().getContent(); 

byte[] buffer = new byte[1024]; 
int len1 = 0; 
while ((len1 = is.read(buffer)) > 0) { 
     f.write(buffer,0, len1); 
} 
f.close(); 
+2

私はあなたがHttpGet/HttpClientをやっているならば、ヘッダーを取得することもできます。この場合、 'Content-Length'を読んで何バイトを取得しているのか正確に知っていて、' byte []正確にそのサイズ。 – Otra

+0

@Otra、反対に、ファイルが非常に大きい場合は、OutOfMemoryError – dwbrito

関連する問題