AssetManager mngr = getAssets();
test_file = mngr.open("sample.txt");
выше переменная test_file имеет тип InputStream. Любой способ вычислить размер файла sample.txt из него?
AssetManager mngr = getAssets();
test_file = mngr.open("sample.txt");
выше переменная test_file имеет тип InputStream. Любой способ вычислить размер файла sample.txt из него?
Думаю, это сработает для вас:
test_file.available();
Сайт разработчика Android:
final int available()
Returns an estimated number of bytes that can be read or skipped without blocking for more input.
У меня есть альтернатива получить размер файла в активах с помощью AssetFileDescriptor:
AssetFileDescriptor fd = getAssets().openFd("test.png");
Long size = fd.getLength();
Надеюсь, что это поможет.
test_file.available();
Не очень надежный способ получить длину файла, как указано в документах.
size = fd.getLength();
Использование FileDescriptor, как показано в Ayublin, есть!
Его ответ должен быть доведен до правильного ответа.
inputStream.available()
может соответствовать размеру файла, если файл очень мал, но для более крупных файлов он не должен совпадать.
Для сжатого актива единственный способ получить размер надежно - это скопировать его в файловую систему, например: context.getCacheDir()
, а затем прочитать длину файла. Вот пример кода, который делает это. Вероятно, тогда также имеет смысл использовать файл из dir кэша, а не активы после этого.
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();
Вы также должны удалить файл из каталога кеша, когда вы закончите с ним (и при удалении приложения весь каталог кэша также будет удален автоматически).