Android:将资产中的tar文件复制到sdcard – IOException

我试图将.tar文件从android资产复制到SD卡,但在复制文件时我收到了IOException。 我正在使用前一个线程的代码如何将文件从’assets’文件夹复制到SD卡?

这是LogCat文件。 我在ASyncTask中做了所有这些,但我也尝试在主UI线程上,仍然得到这个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) 

你在清单中得到了许可吗?

  

因为写某些东西需要得到许可

我认为问题不在于写作的许可。 当您尝试从assets文件夹中读取文件时。 尝试清理项目并重新构建它。 请注意,您必须在MainActivity使用getAssets()来打开资产文件。 使用Try/Catch块捕获IOException以找出根本原因。 请发布相应的代码以帮助您

以下是我将资源文件夹中的XML文件复制到SD卡的操作:

  File toPath = Environment.getExternalStoragePublicDirectory(mAppDirectory); if (!toPath.exists()) { toPath.mkdir(); } try { InputStream inStream = getAssets().open("file.xml"); BufferedReader br = new BufferedReader(new InputStreamReader(inStream)); File toFile = new File(toPath, "file.xml"); copyAssetFile(br, toFile); } catch (IOException e) { } private void copyAssetFile(BufferedReader br, File toFile) throws IOException { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(toFile)); int in; while ((in = br.read()) != -1) { bw.write(in); } } finally { if (bw != null) { bw.close(); } br.close(); } } 

实际上,我认为主要问题是ziptar格式。 当您提供此类文件格式以从assets复制到sdcard时,它无法复制。 原因可能是zip本身就是一个产生问题的文件集合。

但是更改文件扩展名我能够将.tar文件从assets复制到sdcard

最好的想法是保持文件没有扩展资产,并将其写入输出流附加扩展名及其名称(在点之前)。 然后复制此文件将不再是阻碍。