2013-04-18 11 views
5

W jaki sposób radzić sobie z zapisywaniem plików w pamięci urządzenia (pamięć wewnętrzna/Excternal). Wiem, że jeśli wystarczająca ilość miejsca nie jest dostępna, system operacyjny wyrzuci wyjątek IOException, ale jest jakikolwiek sposób, aby z wdziękiem sobie z tym poradzić.Android - jak radzić sobie z zapisywaniem pliku w pamięci urządzenia (pamięć wewnętrzna/zewnętrzna)

+1

Przed napisaniem zawartości pliku, wystarczy sprawdzić w dostępnej wolnej przestrzeni. – Lucifer

+0

Jak komentuje @Lucifer, po sprawdzeniu dostępnego rozmiaru, jeśli odkryjesz, że dostępny rozmiar jest mniejszy niż rozmiar pliku, możesz użyć niektórych algorytmów kompresji, aby skompresować plik, ale pamiętaj, że algorytmy kompresji wymagają czasu: – Abx

+0

zobacz http: // stackoverflow. com/q/3394765/2147039, http://stackoverflow.com/q/2941552/2147039 – Lucifer

Odpowiedz

0

Najpierw znajdź dostępne miejsce na wewnętrzną i zewnętrzną przestrzeń pamięci .. następnie po sprawdzeniu rozmiar pliku jest mniejszy niż dostępna pamięć (wybór wewnętrzny lub zewnętrzny zgodnie z wymaganiami), a następnie zapisz w przeciwnym razie wyświetlanie komunikatu komunikatu ... jeśli potrzebujesz rozmiar Format następnie użyć funkcji z formatSize ....

public static String getAvailableExternalMemorySize() { 
     if (externalMemoryAvailable()) { 
      File path = Environment.getExternalStorageDirectory(); 
      StatFs stat = new StatFs(path.getPath()); 
      long blockSize = stat.getBlockSize(); 
      long availableBlocks = stat.getAvailableBlocks(); 
      return formatSize(availableBlocks * blockSize); 
     } else { 
      return "ERROR"; 
     } 
    } 

public static String getAvailableInternalMemorySize() { 
     File path = Environment.getDataDirectory(); 
     StatFs stat = new StatFs(path.getPath()); 
     long blockSize = stat.getBlockSize(); 
     long availableBlocks = stat.getAvailableBlocks(); 
     return formatSize(availableBlocks * blockSize); 
    } 



public static String formatSize(long size) { 
     String suffix = null; 

     if (size >= 1024) { 
      suffix = "KB"; 
      size /= 1024; 
      if (size >= 1024) { 
       suffix = "MB"; 
       size /= 1024; 
      } 
     } 

     StringBuilder resultBuffer = new StringBuilder(Long.toString(size)); 

     int commaOffset = resultBuffer.length() - 3; 
     while (commaOffset > 0) { 
      resultBuffer.insert(commaOffset, ','); 
      commaOffset -= 3; 
     } 

     if (suffix != null) 
      resultBuffer.append(suffix); 
     return resultBuffer.toString(); 
    } 

Dzięki

+0

Dobry kod. Szukałem rodzaju kodu. Dzięki. –

1
File path = Environment.getDataDirectory(); 
StatFs stat = new StatFs(path.getPath()); 
long blockSize = stat.getBlockSize(); 
long availableBlocks = stat.getAvailableBlocks(); 
return Formatter.formatFileSize(this, availableBlocks * blockSize); 
1

wypróbować funkcję poniżej sprawdzania dostępności pamięci wewnętrznej.

/** 
* This function find outs the free space for the given path. 
* 
* @return Bytes. Number of free space in bytes. 
*/ 
public static long getFreeSpace() 
{ 
    try 
    { 
     if (Environment.getExternalStorageDirectory() != null 
       && Environment.getExternalStorageDirectory().getPath() != null) 
     { 
      StatFs m_stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); 
      long m_blockSize = m_stat.getBlockSize(); 
      long m_availableBlocks = m_stat.getAvailableBlocks(); 
      return (m_availableBlocks * m_blockSize); 
     } 
     else 
     { 
      return 0; 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     return 0; 
    } 
} 

użytkowania powyższa funkcja jak Belo:

 int m_fileSizeInKB = m_fileSize/1024; 
    if (m_fileSize >= getFreeSpace()) 
    { 
     //Show the message to user that there is not enough space available in device. 
     } 
     else 
     { 
     //your business logic here. 
     } 
+0

Cześć chłopaki, bardzo wdzięczni za odpowiedź. Mam jeszcze jedno zapytanie, jeśli rozmiar pliku nie jest znany przed zapisaniem pliku. Jak możemy sobie poradzić z scenariuszem niskiej pamięci. Czy istnieje potrzeba, aby obsłużyć to samo, sprawdzając filespace przed zapisaniem pliku lub przechwyceniem wyjątku IOException. Jaka jest najlepsza praktyka w przypadku niektórych aplikacji zorientowanych na dane? –

+0

Możesz sprawdzić rozmiar pliku przed zapisaniem go w pamięci, co jest najlepszą praktyką. – GrIsHu

+0

Jak sprawdzić rozmiar pliku przed zapisaniem w pamięci @ GrlsHu, –

Powiązane problemy