我正在尝试将.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)
答案 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)
实际上,我认为主要问题是zip
或tar
格式。当您提供此类文件格式以从assets
复制到sdcard
时,它无法复制。原因可能是zip
本身就是一个产生问题的文件集合。
但是更改文件扩展名我可以将.tar
文件从sdcard
复制到assets
。
最好的办法是保留文件中没有扩展名的资源,并将其写入输出流附加扩展名及其名称(在点之前)。然后复制此文件将不再是阻碍。