Преобразовать BufferedInputStream в файл - PullRequest
3 голосов
/ 14 сентября 2011

Я загружаю изображение из Интернета на локальный телефон Android. Код, который у меня есть для записи в файл, выглядит следующим образом

        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 минуту. Есть ли способ, которым я могу оптимизировать это?

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

Вы должны использовать Android HttpClient для извлечения файлов через соединение Java. Также ваш буфер очень маленький. Попробуйте это порезано:

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 голосов
/ 14 сентября 2011

Ваш буфер очень маленький: 255 байт.Вы можете сделать это в 1024 раза больше (255 килобайт).Это приемлемый размер, и это, безусловно, ускорит процесс.

Кроме того, это очень медленно, поскольку он читает байты один за другим:

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

Вы должны попробовать использовать версия массива read () вместо: read(byte[] buffer, int offset, int byteCount) с массивом размером больше, чем я описал выше.

...