如何在Android上将文件从内部应用程序存储移动/重命名为外部存储?

Cod*_*ile 34 java android file

我正在从互联网上下载文件并将流数据保存到我的应用程序内部存储中的临时文件中,由getFilesDir()给出.

下载完成后,我需要将临时文件移动到外部存储器(通常是SD卡)上的下载目录.但由于某种原因,File.renameTo()不适用于此.我猜这是一个问题,因为它是两个独立的文件系统,但我仍然可以直接下载到SD卡,文件URI是正确的.

是否有另一种简单快捷的方法将文件从内部存储器传输到外部,或者我是否必须进行字节流复制并删除原始文件?

Bar*_*ica 83

使用以下代码将文件从内部存储器复制到SD卡,反之亦然:

public static void copyFile(File 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

而且 - 它有效......

  • 如果写/读外部存储器,请确保您具有以下权限<uses-permission android:name ="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name ="android.permission.WRITE_EXTERNAL_STORAGE"/> (7认同)

Jac*_*alk 12

内部和外部存储器是两个不同的文件系统.因此renameTo()失败.

您必须复制文件并删除原始文件


lim*_*lim 10

复制文件后(如@barmaley的精彩答案所示),不要忘记将其公开给设备的图库,以便用户以后查看.

它必须手动完成的原因是

Android仅在重新启动时以及(重新)安装SD卡时运行完整介质扫描

(如本指南所示).

更简单的方法是通过发送广播来调用扫描:

Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(outputFile));
context.sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)

瞧!您现在可以在设备的库中查看您的文件.