Файлы загрузки, больше, чем 1M от папки активов

Я схожу с ума, я создал объект файла, таким образом, он может быть считан с ObjectInputStream, и я поместил папку активов. Работы метода с файлом, меньшим, чем 1M, и, дают ошибку с большими файлами. Я считал, что предел платформы Android, но я также знаю, что этого можно "легко" избежать. Те, кто загрузил игру Гром Reging, например, могут легко видеть, что в их папке активов большой файл 18.9M. Это - мой код для чтения 1 объект от ObjecInputStream

File f = File.createTempFile("mytempfile", "dat");
FileOutputStream fos = new FileOutputStream(f);

InputStream is = mc.getAssets().open(path,3);

ObjectInputStream ois=new ObjectInputStream(is);
byte[] data = (byte[]) ois.readObject();
fos.write(data);

fos.flush();
fos.close();
ois.close();
is.close();

теперь у меня есть несжатый файл, и я могу использовать его, не волнуя по поводу ошибки "Этот файл, не может быть открыт как дескриптор файла; это, вероятно, сжато"

Эти работы функции хорошо с файлами, меньшими, чем 1M, с большими файлами, возвращают java.io. IOException на строке "ObjectInputStream ois=new ObjectInputStream";

почему??

36
задан Syco 18 May 2010 в 18:56
поделиться

5 ответов

Столкнулся с той же проблемой. Я разделил свой файл размером 4 МБ на фрагменты по 1 МБ и при первом запуске объединяю фрагменты в папку данных на телефоне. В качестве дополнительного бонуса APK правильно сжат. Файлы фрагментов называются 1.db, 2.db и т. Д. Код выглядит следующим образом:

File Path = Ctxt.getDir("Data", 0);
File DBFile = new File(Path, "database.db");

if(!DBFile.exists() || DatabaseNeedsUpgrade)  //Need to copy...
    CopyDatabase(Ctxt, DBFile);


static private void CopyDatabase(Context Ctxt, File DBFile) throws IOException
{
    AssetManager assets = Ctxt.getAssets();
    OutputStream outstream = new FileOutputStream(DBFile);
    DBFile.createNewFile();
    byte []b = new byte[1024];
    int i, r;
    String []assetfiles = assets.list("");
    Arrays.sort(assetfiles);
    for(i=1;i<10;i++) //I have definitely less than 10 files; you might have more
    {
        String partname = String.format("%d.db", i);
        if(Arrays.binarySearch(assetfiles, partname) < 0) //No such file in assets - time to quit the loop
            break;
        InputStream instream = assets.open(partname);
        while((r = instream.read(b)) != -1)
            outstream.write(b, 0, r);
        instream.close();
    }
    outstream.close();
}
48
ответ дан 27 November 2019 в 05:22
поделиться

Ограничение касается сжатых ресурсов. Если актив несжатый, система может отобразить данные файла в память и использовать систему подкачки виртуальной памяти Linux для извлечения или отбрасывания блоков размером 4K, если это необходимо. (Инструмент "zipalign" гарантирует, что несжатые ресурсы выровнены по словам в файле, что означает, что они также будут выровнены в памяти при прямом сопоставлении.)

Если ресурс сжат, система должна распаковать все это целиком. на память. Если у вас есть актив 20 МБ, это означает, что 20 МБ физической памяти занято вашим приложением.

В идеале система должна использовать своего рода оконное сжатие, так что должны присутствовать только части, но это требует некоторой фантазии в API ресурсов и схемы сжатия, которая хорошо работает с произвольным доступом. Прямо сейчас APK == Zip со сжатием "deflate", так что это непрактично.

Вы можете сохранить свои ресурсы несжатыми, присвоив им суффикс типа файла, который не сжимается (например, «.png» или «.mp3»). Вы также можете добавить их вручную в процессе сборки с помощью «zip -0» вместо того, чтобы связывать их с помощью aapt. Вероятно, это увеличит размер вашего APK.

32
ответ дан 27 November 2019 в 05:22
поделиться

Я использую NetBeans для сборки пакета и не нашел, как изменить настройки AAPT. Я не пробовал png, но mp3 сжаты. Я могу скомпилировать пакет, а затем войти в папку с активами с параметром -0? какую команду следует использовать?

-1
ответ дан 27 November 2019 в 05:22
поделиться

Вместо папки с ресурсами я поместил свои большие файлы в необработанную папку. Меня устраивает.

0
ответ дан 27 November 2019 в 05:22
поделиться

Изменить расширение файла на .mp3

7
ответ дан 27 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: