Загрузить файл из папки активов в Android Studio - PullRequest
0 голосов
/ 27 ноября 2018

Мне было интересно, есть ли способ получить доступ к файлу и его пути из папки с активами в Android Studio?Причина, по которой мне нужен доступ к файлу и его пути, заключается в том, что я работаю с методом, который ТРЕБУЕТ путь к файлу String, и он должен получить доступ к файлу по своему пути String.Тем не менее, в Android Studio я не нашел способ получить доступ к файлу напрямую из значения String его пути.Я решил использовать обходной путь и просто прочитать файл из InputStream и записать файл в OutputStream, но размер файла составляет около 170 МБ, и он слишком интенсивен для записи файла в OutputStream.Моему приложению требуется около 10:00 минут, чтобы загрузить файл, когда я реализую эту стратегию.Я искал по всему сайту и во многих источниках, чтобы найти решение (книги и документация), но не смог найти жизнеспособное решение.Вот пример моего кода:

@Override
public Model doInBackground(String... params){
        try {
            String filePath = context.getFilesDir() + File.separator + "my_turtle.ttl";
            File destinationFile = new File(filePath);
            FileOutputStream outputStream = new FileOutputStream(destinationFile);
            AssetManager assetManager = context.getAssets();
            InputStream inputStream = assetManager.open("sample_3.ttl");


            byte[] buffer = new byte[10000000];
            int length = 0;
            while ((length = inputStream.read(buffer)) != -1) {
                  outputStream.write(buffer, 0, length);
           }
            outputStream.close();
            inputStream.close();
            model = ModelFactory.createDefaultModel();

            TDBLoader.loadModel(model, filePath, false);//THIS METHOD REQUIRES THE FILE PATH. 
            MainActivity.presenter.setModel(model);

        }catch(FileNotFoundException e){
            e.printStackTrace(System.out);
        }
        catch(IOException e){
            e.printStackTrace(System.out);
        }
        return model;
    }

Как вы видите, метод TDBLoader.loadModel () требует строку для URI файла в качестве второго аргумента, поэтому было бы удобно иметь возможностьполучить доступ к файлу напрямую из папки с активами без использования InputStream.Метод принимает в качестве аргумента (модель Model, строковый URL, логический showProgress).Как я уже упоминал, текущая стратегия, которую я использую, использует слишком много памяти и либо полностью вылетает из приложения, либо занимает 10 минут для загрузки нужного мне файла.Я использую AsyncTask для выполнения этой операции, но из-за продолжительности времени, необходимого для выполнения задачи, которая в этом случае побеждает назначение AsyncTask.

Что еще больше усложняет то, что мне приходится использовать старую версию Apache Jena, потому что я работаю с Android Studio, а официальная версия Apache Jena не совместима с Android Studio.Поэтому я должен использовать порт, которому 8 лет и который не имеет обновленных классов, которые предлагает Apache Jena.Если бы я мог использовать класс RDFParser, я мог бы передать InputStream, но этот класс не существует в более старой версии Apache Jena, которую я должен использовать.

Так что я застрял в этой точке.Метод должен использовать путь URL-адреса String для файла в моей папке ресурсов, но я не знаю, как получить к нему доступ без записи в пользовательский файл из InputStream, но запись в файл из InputStream использует слишком много памяти и силПриложение для сбоя.Если у кого-то есть решение, я буду очень признателен.

1 Ответ

0 голосов
/ 27 ноября 2018

Вот пример моего кода

new byte[10000000] может завершиться ошибкой, поскольку у вас может не быть ни одного непрерывного блока памяти такого большого размера.Кроме того, у вас может не хватить места в куче для начала.Используйте меньшее число, например 65536.

Моему приложению требуется около 10:00 минут для загрузки файла, когда я реализую эту стратегию

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

Вы запускаете свое приложение на Android.Android Studio не работает на Android.Активы не являются файлами на устройстве Android.Это записи в файле APK, который в основном представляет собой ZIP-архив.По сути, ваш код распаковывает 170 МБ материала и записывает его в файл.

Если у кого-то есть решение, я буду очень признателен.

Работайте с некоторыми людьми, чтобы портировать через обновленную версию Jena, которая предлагает чтение RDF из InputStream.

или переключиться на какую-нибудь другую библиотеку RDF.

Или работайте напрямую с форматом файла RDF.

Или используйте файл RDF меньшего размера, чтобы копирование занимало меньше времени.

Или загрузите файл RDF, если вы считаете, что это предпочтительнее, чемкопирование актива.

Или выполните копирование актива в файл на переднем плане JobIntentService, обновляя прогресс в связанном с ним Notification, чтобы пользователь мог выполнять другие действия на своем устройстве, пока вызаполните копию.

...