Android:ZipFile()java.util.zip.ZipException:文件太短而无法成为zip文件:0

时间:2018-09-04 19:19:42

标签: java android keras zip dl4j

我正在研究一个项目(使用Android Studio 3.1.4),该项目读取存储为.zip文件的神经网络,供Android中的DL4J进一步使用。

我正在尝试打开位于我的项目res \ raw目录中的.zip文件。为此,我尝试使用java.util.zip中的ZipFile()方法。

Screenshot of location of neuralnet.zip

问题:

以下代码引发异常:

File model_file = new File(String.valueOf(this.getResources().openRawResource(R.raw.neuralnet)));
ZipFile zipFile = new ZipFile(model_file);

例外:

  

“ java.util.zip.ZipException:文件太短而无法成为zip文件:0”

因此,我无法加载模型。在运行Android API 24的模拟设备上进行测试

在API 26上,例外有所不同:

  

java.io.FileNotFoundException:文件不存在:android.content.res.AssetManager$AssetInputStream@ddde727

有人在使用ZipFile()或在Android中使用DL4J加载神经网络模型方面有经验吗?

build.gradle是否需要一些特殊的东西?

感谢任何输入!

我尝试过的事情:

  • 检查.zip文件以确保其存在。
  • 通过使用7Zip将未压缩的.zip文件压缩为.zip,确保.zip只是一个容器,并且不压缩文件,
  • 检查了READ_EXTERNAL_STORAGE权限,即使我认为这不是必需的
  • 尝试使用完整路径而不是使用this.getResources()。openRawResource(R.raw.neuralnet)

Android权限: 我正在运行android api> 23,并且在运行时请求READ_EXTERNAL_STORAGE权限。

清单包括:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

谢谢

Mo

2 个答案:

答案 0 :(得分:2)

您的问题是文件打开的方式。

要打开原始文件,请查看以下链接:

https://developer.android.com/guide/topics/resources/providing-resources

How to read file from res/raw by name

答案 1 :(得分:1)

我可以通过解决ZipFile()方法来打开存档的内容,该方法给了我另一个错误,因为它期望使用路径而不是资源标识符。

仍然,打开存档文件,我使用了“ No Body”建议的方法:

InputStream ins1 = getResources().openRawResource(getResources().getIdentifier("configuration", "raw", getPackageName()));
InputStream ins2 = getResources().openRawResource(getResources().getIdentifier("coefficients", "raw", getPackageName()));
InputStream ins3 = getResources().openRawResource(getResources().getIdentifier("updaterstate", "raw", getPackageName()));
model = restoreMultiLayerNetwork(ins1, ins2, ins3, false);