Android:将tar文件从资产复制到sdcard - IOException

时间:2014-01-11 07:22:00

标签: java android assets file-copying

我正在尝试将.tar文件从android资产复制到sdcard,但在复制文件时我收到了IOException。我正在使用前一个帖子How to copy files from 'assets' folder to sdcard?

中的代码

这是LogCat文件。我在ASyncTask中做了所有这些,但我也在主UI线程上尝试了它,但仍然得到了这个异常。

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)

4 个答案:

答案 0 :(得分:2)

你是否已获得舱单的许可。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

以下是将资源文件夹中的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();
    }
}

答案 3 :(得分:0)

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

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

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