Android: копирование tar-файла из ресурсов на SD-карту – IOException

Я пытаюсь скопировать файл .tar из ресурсов Android на SD-карту, но при копировании файла я получаю IOException. Я использую этот код из предыдущего потока Как копировать файлы из папку «активы» на SD-карту?

Вот файл LogCat. Я делаю все это в ASyncTask, но я также пробовал это в основном потоке пользовательского интерфейса и все еще получаю это исключение.

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)

person Master    schedule 11.01.2014    source источник
comment
Это странно. Я также получаю это исключение, но мой файл правильно копируется на SD-карту, поэтому я просто проигнорировал исключение :)   -  person Muhammad Babar    schedule 04.01.2015
comment
Кстати, вы проверили внешнее хранилище? Файл существует или нет?   -  person Muhammad Babar    schedule 04.01.2015
comment
Я получил решение. Я уже опубликовал это.   -  person Master    schedule 04.01.2015
comment
Я знаю, но вы можете ответить на это? Кстати, вы проверили внешнее хранилище? Файл существует или нет?   -  person Muhammad Babar    schedule 04.01.2015


Ответы (4)


Дали ли вы разрешение в файле manifest.

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

потому что для записи чего-то на sd нужно разрешение

person Praween Kumar Mishra    schedule 11.01.2014
comment
Это первое, что я сделал. Я не получаю исключения из-за этого. Есть какая-то другая причина. - person Master; 11.01.2014
comment
Я добавил трассировку журнала в исходный вопрос. - person Master; 11.01.2014
comment
вы проверили размер файла .tar в папке вашего менеджера активов. Насколько я знаю, мы можем копировать только файлы размером менее 1 Мб из файлового менеджера активов. Посетите stackoverflow.com /вопросы/2860157/ - person Praween Kumar Mishra; 11.01.2014
comment
Проверьте размер файла tar. Он меньше 1 МБ, потому что Android имеет ограничение по размеру в папке ресурсов, а также проверьте, есть ли фиксированное расширение, которое поддерживается в папке ресурсов. - person Akhil Dad; 11.01.2014

Я не думаю, что проблема в разрешении писать. Это когда вы пытаетесь прочитать файл из папки с ресурсами. Попробуйте очистить свой проект и собрать его снова. Обратите внимание, что вы должны использовать getAssets() в своем MainActivity, чтобы открыть файл актива. Используйте блок Try/Catch, чтобы поймать IOException, чтобы выяснить основную причину. Пожалуйста, отправьте соответствующий код, чтобы помочь вам

person Keerthivasan    schedule 11.01.2014
comment
Я разместил ссылку, из которой я использую код. По этой ссылке принятым ответом является то, что я использую в качестве кода для копирования файла из активов. - person Master; 11.01.2014

Вот что я делаю, чтобы скопировать файл 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();
    }
}
person Rick Falck    schedule 11.01.2014
comment
Спасибо за Ваш ответ. Я понял, где была проблема. Источником проблемы было расширение файла. - person Master; 11.01.2014

На самом деле, я думаю, что основная проблема заключается в формате zip или tar. Он не может копироваться, когда вы предоставляете такой формат файла для копирования из assets в sdcard. Причина может заключаться в том, что zip сам по себе представляет собой набор файлов, который создает проблему.

Но изменив расширение файла, я могу скопировать этот файл .tar в sdcard из assets.

Лучшая идея - сохранить файл без расширения в активах и при записи его в выходной поток добавить расширение с его именем (предыдущая точка). Тогда копирование этого файла больше не будет помехой.

person Master    schedule 11.01.2014