从android studio中的资产文件夹中加载文件

时间:2018-11-26 23:49:13

标签: java android apache rdf jena

我想知道是否有一种方法可以访问文件,并且它是从android studio中的资产文件夹中获取的路径吗?我需要访问文件及其路径的原因是因为我正在使用一种方法,该方法需要文件的String路径,并且它必须从其String路径访问文件。但是,在android studio中,我没有找到直接从其路径的String值访问文件的方法。我决定使用一种解决方法,只是从InputStream读取文件并将文件写入OutputStream,但是该文件大约为170MB,并且将文件写入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便很方便。该方法作为参数(模型模型,字符串url,布尔值showProgress)。正如我所提到的,我当前使用的策略占用了太多内存,或者使应用程序完全崩溃,或者花了10分钟来下载我需要的文件。我正在使用AsyncTask来执行此操作,但是由于执行任务所需的时间太长,因此在这种情况下无法达到AsyncTask的目的。

使事情更加复杂的是,我必须使用旧版本的Apache Jena,因为我正在使用Android Studio,而Apache Jena的正式版本与android studio不兼容。因此,我必须使用8岁的端口,该端口没有Apache Jena提供的更新的类。如果可以使用RDFParser类,则可以传递InputStream,但是该类在我必须使用的较旧版本的Apache Jena中不存在。

因此,我被困在这一点上。该方法必须利用我的资产文件夹中文件的字符串url路径,但是我不知道如何在不从InputStream写入自定义文件的情况下访问该文件,但是从InputStream写入文件会占用过多的内存和强制性该应用程序崩溃。如果有人有解决方案,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

这是我的代码示例

zFactor.el.dataset('scale') = 0.5; zFactor.update(); 可能会失败,因为您可能没有单个连续的大内存块。另外,您可能没有太多的堆空间。使用较小的数字,例如65536。

  

实施该策略时,我的应用程序大约需要10:00分钟才能下载文件

时间因硬件而异。我不希望它在大多数设备上都那么慢,但是在某些设备上可能会如此。

  

我想知道是否有一种方法可以访问文件,并且它是从android studio中的资产文件夹中获取的路径吗?

您正在Android上运行您的应用。 Android Studio未在Android上运行。资产不是Android设备上的文件。它们是APK文件(基本上是ZIP存档)中的条目。实际上,您的代码正在解压缩170MB的素材并将其写到文件中。

  

如果有人有解决方案,我将不胜感激。

与某些人一起移植Jena的更新版本,该版本提供了从new byte[10000000]读取RDF的功能。

或切换到其他RDF库。

或者直接使用RDF文件格式。

或者使用较小的RDF文件,因此复制所需的时间更少。

或下载RDF文件,如果您认为复制该资产会更好。

或者在前台InputStream中进行资产到文件的复制,以更新其关联的JobIntentService中的进度,以便用户在完成复制时可以在其设备上执行其他操作。