Размер файла, который мы получаем через функцию AssetManager getAssets в Android

AssetManager mngr = getAssets();
test_file = mngr.open("sample.txt");

выше переменная test_file имеет тип InputStream. Любой способ вычислить размер файла sample.txt из него?

Ответ 1

Думаю, это сработает для вас:

test_file.available();

Сайт разработчика Android:

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

Ответ 2

У меня есть альтернатива получить размер файла в активах с помощью AssetFileDescriptor:

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

Надеюсь, что это поможет.

Ответ 3

test_file.available();

Не очень надежный способ получить длину файла, как указано в документах.

size = fd.getLength();

Использование FileDescriptor, как показано в Ayublin, есть!

Его ответ должен быть доведен до правильного ответа.

Ответ 4

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();

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