我试图复制从Android的资产SD卡一个.tar文件,但复制文件我收到IOException异常。我用这code从previous线程Android:如何在资产到SD卡?
复制文件下面是LogCat中的文件。我做这一切的AsyncTask,但我也试图在主UI线程但还是收到这个异常。
6月1日至11日:51:49.925:E /标签(3881):无法复制资源文件:temp.tar六月1日至11日:51:49.925:E /标签(3881):java.io.IOException异常六月1日至11日:51:49.925:E /标签(3881):在android.content.res.AssetManager.readAsset(本机方法)六月1日至11日:51:49.925:E /标签(3881):在android.content.res.AssetManager.access $ 700(AssetManager.java:36)六月1日至11日:51:49.925:E /标签(3881):在android.content.res.AssetManager $ AssetInputStream.read(AssetManager.java:571)六月1日至11日:51:49.925:E /标签(3881):在com.example.apptest.MainActivity.copyFile(MainActivity.java:130)六月1日至11日:51:49.925:E /标签(3881):在com.example.apptest.MainActivity.copyAssets(MainActivity.java:116)六月1日至11日:51:49.925:E /标签(3881):在com.example.apptest.MainActivity.access $ 0(MainActivity.java:97)六月1日至11日:51:49.925:E /标签(3881):在com.example.apptest.MainActivity $ 1.doInBackground(MainActivity.java:32)六月1日至11日:51:49.925:E /标签(3881):在com.example.apptest.MyASyncTask.doInBackground(MyASyncTask.java:1)六月1日至11日:51:49.925:E /标签(3881):在android.os.AsyncTask $ 2.call(AsyncTask.java:185)六月1日至11日:51:49.925:E /标签(3881):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:305)六月1日至11日:51:49.925:E /标签(3881):在java.util.concurrent.FutureTask.run(FutureTask.java:137)六月1日至11日:51:49.925:E /标签(3881):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)六月1日至11日:51:49.925:E /标签(3881):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:561)六月1日至11日:51:49.925:E /标签(3881):在java.lang.Thread.run(Thread.java:1096)
解决方案
其实,我觉得主要的问题是与拉链
或焦油
格式。当你提供这个还挺文件格式从资产
复制到 SD卡
它不能复制。原因可能是拉链
本身文件的集合创造的问题。
但改变文件扩展名我能够复制的.tar
从文件到 SD卡
资产
。
最好的办法是保持无扩展名的资产文件,并同时写入到输出流追加扩展它的名字(preceding点)。然后复制这个文件将被不再阻。
I am trying to copy a .tar file from android assets to sdcard but while copying file I am getting IOException. I am using this code from a previous thread Android: How to copy files in 'assets' to sdcard?
Here is LogCat file. I am doing all this in ASyncTask but I have also tried it on main UI thread and still getting this exception.
01-11 06:51:49.925: E/tag(3881): Failed to copy asset file: temp.tar
01-11 06:51:49.925: E/tag(3881): java.io.IOException
01-11 06:51:49.925: E/tag(3881): at android.content.res.AssetManager.readAsset(Native Method)
01-11 06:51:49.925: E/tag(3881): at android.content.res.AssetManager.access$700(AssetManager.java:36)
01-11 06:51:49.925: E/tag(3881): at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:571)
01-11 06:51:49.925: E/tag(3881): at com.example.apptest.MainActivity.copyFile(MainActivity.java:130)
01-11 06:51:49.925: E/tag(3881): at com.example.apptest.MainActivity.copyAssets(MainActivity.java:116)
01-11 06:51:49.925: E/tag(3881): at com.example.apptest.MainActivity.access$0(MainActivity.java:97)
01-11 06:51:49.925: E/tag(3881): at com.example.apptest.MainActivity$1.doInBackground(MainActivity.java:32)
01-11 06:51:49.925: E/tag(3881): at com.example.apptest.MyASyncTask.doInBackground(MyASyncTask.java:1)
01-11 06:51:49.925: E/tag(3881): at android.os.AsyncTask$2.call(AsyncTask.java:185)
01-11 06:51:49.925: E/tag(3881): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-11 06:51:49.925: E/tag(3881): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-11 06:51:49.925: E/tag(3881): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
01-11 06:51:49.925: E/tag(3881): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
01-11 06:51:49.925: E/tag(3881): at java.lang.Thread.run(Thread.java:1096)
解决方案
Actually, I think the main problem is with zip
or tar
format. It can not copy when you provide this kinda file format to copy from assets
to sdcard
. Reason might be that zip
is in itself a collection of files which creates problem.
But changing the file extension I am able to copy that .tar
file to sdcard
from assets
.
The best idea is to keep your file without extension in assets and while writing it to output stream append extension with its name(preceding dot). Then copying this file will be not hinderance anymore.