我想知道是否有一种方法可以访问文件,并且它是从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写入文件会占用过多的内存和强制性该应用程序崩溃。如果有人有解决方案,我将不胜感激。
答案 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
中的进度,以便用户在完成复制时可以在其设备上执行其他操作。