2011-08-09 6 views
14
AssetManager mngr = getAssets(); 
test_file = mngr.open("sample.txt"); 

powyżej zmiennej test_file jest typu InputStream. Jakikolwiek sposób obliczyć rozmiar pliku sample.txt z niego?Rozmiar pliku, który otrzymujemy za pośrednictwem funkcji AssetManager getAssets w systemie Android

+0

prosimy o trochę więcej wysiłku w zadawaniu pytań. Spróbuj przeczytać FAQ http://stackoverflow.com/faq, aby uzyskać więcej informacji na temat zadawania pytań. – Janusz

+0

OK, dziękuję za informacje. – Dominic

Odpowiedz

-2

myślę, że to będzie pracować dla Ciebie:

test_file.available(); 

Android strona programu:

final int available() 
Returns an estimated number of bytes that can be read or skipped without blocking for more input. 
+0

Dzięki, działa dobrze. Mała poprawka, zamiast mngr.available() pojawi się plik test_file.available(). – Dominic

+0

Tak, dobrze. Słyszę mój błąd. – hardartcore

+17

-1 To nie jest bezpieczny sposób na sprawdzenie rozmiaru pliku, ponieważ dostępne tylko zwraca pozostałe buforowane dane, które mogą być lub nie są wielkością pliku. –

46

mam alternatywę, aby uzyskać rozmiar pliku w aktywach użyciu AssetFileDescriptor:

AssetFileDescriptor fd = getAssets().openFd("test.png"); 
Long size = fd.getLength(); 

Mam nadzieję, że to pomaga.

+0

yaa też działa. Dzięki .. – Dominic

+0

działa jeszcze lepiej !! Dziękuję – nurxyz

+9

Krótka notatka: Nie działa to w przypadku skompresowanych zasobów (otrzymasz wyjątek), ale zaakceptowane rozwiązanie działa również w przypadku skompresowanych zasobów i zwróci nieskompresowany rozmiar (czyli dokładnie to, czego chcemy). – jek

1
test_file.available(); 

Nie jest niezawodną metodą uzyskania długości pliku, jak podano w dokumentacji.

size = fd.getLength(); 

Używanie FileDescriptor pokazanego przez Ayublin jest!

Jego odpowiedź powinna zostać podniesiona do poprawnej odpowiedzi.

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić w nim istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/17437638) – igr

0

inputStream.available() może odpowiadać rozmiarowi pliku, jeśli plik jest bardzo mały, ale w przypadku większych plików nie jest zgodny.

W przypadku skompresowanego zasobu jedynym sposobem uzyskania niezawodnie rozmiaru jest skopiowanie go do systemu plików, np. context.getCacheDir(), a następnie odczytanie z niego długości pliku. Oto przykładowy kod, który to robi. Prawdopodobnie wtedy również sensowne jest używanie pliku z katalogu pamięci podręcznej, w przeciwieństwie do zasobów po tym.

String filename = "sample.txt"; 
InputStream in = context.getAssets().open(filename); 
File outFile = new File(context.getCacheDir(), filename); 
OutputStream out = new FileOutputStream(outFile); 

try { 
    int len; 
    byte[] buff = new byte[1024]; 
    while ((len = in.read(buff)) > 0) { 
     out.write(buff, 0, len); 
    } 
} finally { 
    // close in & out 
} 
long theRealFileSizeInBytes = outFile.length(); 

Należy również usunąć plik z pamięci podręcznej reż kiedy jesteś z nim zrobić (i cały cache dir zostanie również automatycznie usuwane podczas odinstalowywania aplikacji).

Powiązane problemy