android复制文件从资产到SD卡

时间:2014-11-23 23:16:56

标签: java android methods copy assets

这是MyNewMain.java

        CopyAssets();


    private void CopyAssets() {
        AssetManager assetManager = getAssets();
        String[] files = null;
        try {
            files = assetManager.list("Files");
        } catch (IOException e) {
            Log.e("tag", e.getMessage());
        }

        for(String filename : files) {
            System.out.println("File name => "+filename);
            InputStream in = null;
            OutputStream out = null;
            try {
                in = assetManager.open("Files/"+filename);
                out = new FileOutputStream(Environment.getExternalStorageDirectory().toString() +"/" + filename);
                copyFile(in, out);
                in.close();
                in = null;
                out.flush();
                out.close();
                out = null;
            } catch(Exception e) {
                Log.e("tag", e.getMessage());
            }
        }
    }
    private void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[1024];
        int read;
        while((read = in.read(buffer)) != -1){
            out.write(buffer, 0, read);
        }
    }

在我的资源文件夹中,我有一个名为Files的文件夹。有.txt文件 onCreate methed我正在调用CopyAssets();

我使用的方法越低。

问题是这没有任何作用。我绝对不知道为什么我的文件没有被复制。 在我的清单中我添加了

和app.iml包含

2 个答案:

答案 0 :(得分:0)

我知道这已经得到了解答,但我有一种更优雅的方式从资产目录复制到SD卡上的文件。它不需要"对于"循环但是使用文件流和频道来完成工作。

(注意)如果使用任何类型的压缩文件,APK,PDF,...您可能希望在插入资产之前重命名文件扩展名,然后在将其复制到SD卡后重命名)

AssetManager am = context.getAssets();
AssetFileDescriptor afd = null;
try {
    afd = am.openFd( "MyFile.dat");

    // Create new file to copy into.
    File file = new File(Environment.getExternalStorageDirectory() + java.io.File.separator + "NewFile.dat");
    file.createNewFile();

    copyFdToFile(afd.getFileDescriptor(), file);

} catch (IOException e) {
    e.printStackTrace();
}

一种复制文件而无需循环播放文件的方法。

public static void copyFdToFile(FileDescriptor src, File dst) throws IOException {
    FileChannel inChannel = new FileInputStream(src).getChannel();
    FileChannel outChannel = new FileOutputStream(dst).getChannel();
    try {
        inChannel.transferTo(0, inChannel.size(), outChannel);
    } finally {
        if (inChannel != null)
            inChannel.close();
        if (outChannel != null)
            outChannel.close();
    }
}

感谢JPM's Answer

答案 1 :(得分:-1)

在android api 22上,在getFileDescriptor()对象上调用AssetFileDescriptor将返回整个apk文件的FileDescriptor。所以@ Salmaan的答案在android api 22上是错误的。

我没有在其他api中看到源代码。所以我不知道getFileDescriptor()在其他api中的行为。

我在this question下找到答案。