【问题标题】:Android: Copying tar file from assets to sdcard - IOExceptionAndroid:将 tar 文件从资产复制到 sdcard - IOException
【发布时间】:2014-01-30 08:06:29
【问题描述】:

我正在尝试将 .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)

【问题讨论】:

  • 这很奇怪。我也遇到了这个异常,但是我的文件被正确复制到了 sdcard,所以我忽略了这个异常:)
  • 顺便说一句,您检查了外部存储吗?文件是否存在?
  • 我得到了解决方案。我已经发布了。
  • 我知道,但你能回答这个问题吗?顺便说一句,您检查过外部存储吗?文件是否存在?

标签: java android assets file-copying


【解决方案1】:

您是否已在清单中授予权限。

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

因为写东西到sd需要权限

【讨论】:

  • 这是我做的第一件事。因此,我没有例外。还有其他原因。
  • 我在原问题中添加了日志跟踪。
  • 您是否检查了资产管理器文件夹中 .tar 文件的文件大小。据我所知,我们只能从资产文件管理器中复制小于 1 Mb 的文件。访问stackoverflow.com/questions/2860157/…
  • 检查 tar 文件的大小。是否小于 1MB,因为 android 在资产文件夹中有大小限制,还要检查资产文件夹中是否支持固定扩展名
【解决方案2】:

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

【讨论】:

  • 我已经发布了一个链接,我正在使用该链接。在该链接上,接受的答案是我用作从资产复制文件的代码。
【解决方案3】:

这是我将一个 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();
    }
}

【讨论】:

  • 感谢您的回答。我明白了问题所在。问题的根源是文件扩展名。
【解决方案4】:

实际上,我认为主要问题在于ziptar 格式。当您提供这种文件格式从assets 复制到sdcard 时,它无法复制。原因可能是zip 本身就是造成问题的文件集合。

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

最好的办法是让您的文件在资产中没有扩展名,并在将其写入输出流时附加扩展名及其名称(前面的点)。那么复制这个文件就不再是障碍了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多