2015-01-18 3 views
1

Я использую библиотеку для извлечения файла .xz на Android размером около 16 МБ. Я запускаю код экстракции/декомпрессии как AsyncTask, и поэтому я хотел бы видеть процент извлечения с помощью метода onProgressUpdate(Integer ... values).Получите процент извлечения с XZ Java для android

Мой код декомпрессии выглядит примерно так.

 byte[] buf = new byte[8192]; 
     String name = null; 

     try { 
      name = "my_archive.xz"; 
      InputStream in = getResources().openRawResource(R.raw.my_archive);//new FileInputStream(name); // 
      FileOutputStream out = openFileOutput("my_archive.sqlite", Context.MODE_PRIVATE); 

      label = (TextView)findViewById(R.id.textLabel); 
      try { 
       in = new XZInputStream(in); 

       label.setText("Writing db file."); 
       int size; 
       while ((size = in.read(buf)) != -1) { 
        out.write(buf,0,size); 
        progress++; 
        publishProgress(progress); 
       } 

      } 
      catch (Exception e) 
      { 
       System.err.println("Input Stream error: "+e.getMessage()); 
      } 
      finally { 
       // Close FileInputStream (directly or indirectly 
       // via LZMAInputStream, it doesn't matter). 
       in.close(); 
      } 


     } catch (FileNotFoundException e) { 
      System.err.println("LZMADecDemo: Cannot open " + name + ": " 
        + e.getMessage()); 
      System.exit(1); 

     } catch (EOFException e) { 
      System.err.println("LZMADecDemo: Unexpected end of input on " 
        + name); 
      System.exit(1); 

     } catch (IOException e) { 
      System.err.println("LZMADecDemo: Error decompressing from " 
        + name + ": " + e.getMessage()); 
      System.exit(1); 
     } 

Переменная progress должна фактически удерживать процентное значение. Если кто-то работал с этой библиотекой, и если бы вы вычислили простой способ расчета процента прогресса, пожалуйста, помогите мне здесь.

Заранее благодарим за помощь.

ответ

1

Я попытался получить размер архивного файла с помощью метода available() во входном потоке, как показано ниже.

InputStream in = getResources().openRawResource(R.raw.my_archive); 
int fileSize = in.available(); 

И в процессе экстракции, я подсчитал, прогресс, как показано ниже:

   int size; 
       int counter=0; 
       while ((size = in.read(buf)) != -1) { 
        out.write(buf,0,size); 
        counter++; 
        progress = (int) (counter*100*1024/(double)fileSize); 
        publishProgress(progress); 
       } 

Однако это не приводит к правому прогрессу по некоторым причинам. Прогресс идет до 108% до его завершения. Я знаю, что я делаю что-то неправильно здесь, поэтому, пожалуйста, улучшите этот ответ с правильным расчетом.

С благодарностью