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

3
我正在开发一个项目(使用Android Studio 3.1.4),该项目读取存储为.zip文件的神经网络,以便在Android中使用DL4J进一步使用。
我试图打开位于项目res\raw目录中的.zip文件。为此,我尝试使用java.util.zip中的ZipFile()方法。 神经网络.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 文件是否存在。
  • 确保 .zip 只是一个容器,文件未压缩,通过使用 7Zip 将包含的 3 个文件归档为 .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" />

谢谢,

2个回答

2

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接