将文件存储在 Android 上以供本地阅读
Storing file on Android for Native reading
我正在为 android 编写应用程序并且我正在使用 caffe 库。我的问题是开始时我需要初始化 caffe,这是通过将两个文件(网络结构)传递给 caffe 来完成的。
问题是我不知道如何在设备上存储额外的文件。我已经将模型文件添加到资产中,但我不知道如何使用文件路径读取它。你能告诉我在哪里存储这些可以使用文件路径访问的文件吗?
感谢任何想法。
这应该可以做到。只需将这些文件从资产文件夹复制到数据目录即可。如果您已经拥有这些文件,只需加载它们即可。
String toPath = "/data/data/" + getPackageName(); // Your application path
private static boolean copyAssetFolder(AssetManager assetManager,
String fromAssetPath, String toPath) {
try {
String[] files = assetManager.list(fromAssetPath);
new File(toPath).mkdirs();
boolean res = true;
for (String file : files)
if (file.contains("."))
res &= copyAsset(assetManager,
fromAssetPath + "/" + file,
toPath + "/" + file);
else
res &= copyAssetFolder(assetManager,
fromAssetPath + "/" + file,
toPath + "/" + file);
return res;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private static boolean copyAsset(AssetManager assetManager,
String fromAssetPath, String toPath) {
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(fromAssetPath);
new File(toPath).createNewFile();
out = new FileOutputStream(toPath);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
return true;
} catch(Exception e) {
e.printStackTrace();
return false;
}
}
private static void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
}
将它们作为资产放入您的项目中,然后在应用启动时,您可以从资产中读取它们并将它们复制到应用的私有存储区中。您可以使用 Context.getFilesDir()
.
找到此目录
从那里,您将能够将文件传递给 Caffe。
资产被打包并且只能使用特殊方法访问,所以我通过访问文件解决了问题,然后将其复制到我传递给本机方法的新位置。
我正在为 android 编写应用程序并且我正在使用 caffe 库。我的问题是开始时我需要初始化 caffe,这是通过将两个文件(网络结构)传递给 caffe 来完成的。 问题是我不知道如何在设备上存储额外的文件。我已经将模型文件添加到资产中,但我不知道如何使用文件路径读取它。你能告诉我在哪里存储这些可以使用文件路径访问的文件吗?
感谢任何想法。
这应该可以做到。只需将这些文件从资产文件夹复制到数据目录即可。如果您已经拥有这些文件,只需加载它们即可。
String toPath = "/data/data/" + getPackageName(); // Your application path
private static boolean copyAssetFolder(AssetManager assetManager,
String fromAssetPath, String toPath) {
try {
String[] files = assetManager.list(fromAssetPath);
new File(toPath).mkdirs();
boolean res = true;
for (String file : files)
if (file.contains("."))
res &= copyAsset(assetManager,
fromAssetPath + "/" + file,
toPath + "/" + file);
else
res &= copyAssetFolder(assetManager,
fromAssetPath + "/" + file,
toPath + "/" + file);
return res;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private static boolean copyAsset(AssetManager assetManager,
String fromAssetPath, String toPath) {
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(fromAssetPath);
new File(toPath).createNewFile();
out = new FileOutputStream(toPath);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
return true;
} catch(Exception e) {
e.printStackTrace();
return false;
}
}
private static void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
}
将它们作为资产放入您的项目中,然后在应用启动时,您可以从资产中读取它们并将它们复制到应用的私有存储区中。您可以使用 Context.getFilesDir()
.
从那里,您将能够将文件传递给 Caffe。
资产被打包并且只能使用特殊方法访问,所以我通过访问文件解决了问题,然后将其复制到我传递给本机方法的新位置。