我想在sd-card上的指定文件夹中复制我的资源文件夹的文件和文件夹。这是我的代码:
private void copyFiles() {
AssetManager assetManager = getAssets();
InputStream in = null;
OutputStream out = null;
try
{
String files[] = assetManager.list("Files");
for (String fileName : files)
{
Log.d("File name =>", fileName);
in = assetManager.open("Files/" + fileName);
out = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyApp/Files/" + fileName);
copyFile(in, out);
out.flush();
}
in.close();
out.close();
}
catch (IOException e) { e.printStackTrace(); }
}
private 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);
}
问题是此方法不会复制sd-card上资产的子文件夹项。事实上,在第一次出现时它会捕获IO异常。这是我的资产文件夹结构:
以下是LogCat错误消息:
01-12 20:13:51.692: W/System.err(12798): java.io.FileNotFoundException: Files/01
01-12 20:13:51.742: W/System.err(12798): at android.content.res.AssetManager.openAsset(Native Method)
01-12 20:13:51.742: W/System.err(12798): at android.content.res.AssetManager.open(AssetManager.java:325)
01-12 20:13:51.742: W/System.err(12798): at android.content.res.AssetManager.open(AssetManager.java:299)
01-12 20:13:51.742: W/System.err(12798): at com.handydic.view.WelcomeScreen.copyDefaultTheme(WelcomeScreen.java:105)
01-12 20:13:51.742: W/System.err(12798): at com.handydic.view.WelcomeScreen.setup(WelcomeScreen.java:70)
01-12 20:13:51.742: W/System.err(12798): at com.handydic.view.WelcomeScreen.onCreate(WelcomeScreen.java:38)
01-12 20:13:51.742: W/System.err(12798): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
01-12 20:13:51.742: W/System.err(12798): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1836)
01-12 20:13:51.742: I/RosieUtility(12838): enable self killer: mEnabled=0
01-12 20:13:51.742: W/System.err(12798): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1893)
01-12 20:13:51.742: W/System.err(12798): at android.app.ActivityThread.access$1500(ActivityThread.java:135)
01-12 20:13:51.752: W/System.err(12798): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054)
01-12 20:13:51.752: W/System.err(12798): at android.os.Handler.dispatchMessage(Handler.java:99)
01-12 20:13:51.752: W/System.err(12798): at android.os.Looper.loop(Looper.java:150)
01-12 20:13:51.752: W/System.err(12798): at android.app.ActivityThread.main(ActivityThread.java:4385)
01-12 20:13:51.752: W/System.err(12798): at java.lang.reflect.Method.invokeNative(Native Method)
01-12 20:13:51.752: W/System.err(12798): at java.lang.reflect.Method.invoke(Method.java:507)
01-12 20:13:51.752: W/System.err(12798): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
01-12 20:13:51.752: W/System.err(12798): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
01-12 20:13:51.762: W/System.err(12798): at dalvik.system.NativeStart.main(Native Method)
LogCat输出中的第四行" copyDefaultTheme()"表示我写过的第105行" in = assetManager.open(" Files /" + fileName);"
知道该怎么办?感谢。
答案 0 :(得分:2)
如你所见,我编辑了我的代码而不是Log.e(...)我写了“e.printStackTrace();”
您应该将其保留为Log.e()
。您之前编辑的问题是您无法复制并粘贴整个堆栈跟踪。这很重要,因为异常的第一行告诉你你做错了什么:
java.io.FileNotFoundException: Files/01
调用assetManager.list("Files")
应返回一个包含字符"01"
和"02"
的双元素数组,表示Files/
中的两个子目录。然后,您需要以递归方式下降到查找文件的位置,并在输出中创建相应的目录。
您可以在on StackOverflow,this blog post,以及通过网络搜索android copy assets recursively
找到的许多其他网页中找到此this GitHub Gist的示例代码。
此外,比Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyApp/Files/"
更好的位置是getExternalFilesDir()
,这是Context
上可用的方法,例如Activity
。这不仅已经为您提供了外部存储上特定于应用程序的目录,而且还会在用户卸载您的应用程序时自动删除该目录。