【问题标题】:Copy 12MB folder with 2500 files from assets to sd card quickly将包含 2500 个文件的 12MB 文件夹从资产快速复制到 SD 卡
【发布时间】:2013-07-25 15:50:54
【问题描述】:

我正在尝试将大量文件夹和子文件夹从我的 apk 资产文件夹快速复制到我的 SD 卡。这些文件夹包含 12mb 的小文件,总共可能有 2500 个。此SO 问题的代码示例有效,但在我的设备上需要超过 5 分钟。有没有更快的方法来做到这一点?

我最初尝试将文件夹添加到 zip 存档并在将其移动到设备上后将其解压缩,但它在不同设备上产生了许多问题,并且在整个过程中失败了很多。

【问题讨论】:

  • 那么从存档文件而不是目录树和子目录树中读取文件呢? (即没有压缩的 zip)。在这种情况下,您只需复制一个文件。
  • @DJHell 这是个好主意。一半的文件是 png 图像,另一半是文本文件。我将如何通过我的代码引用这些文件的位置。我假设Environment.getExternalStorageDirectory() + File.separator + "appFolder" + File.separator + "files.zip" + File.separator + "image.png" 不起作用
  • @MiroMarkarian 我正在构建此应用程序以在 Google Play 上销售,因此这不是告诉用户的选项,而且我的手机没有 sd 卡,而是模拟的。
  • 一个简单的 getFileFromMyZippedFile(String filePath) 可能带有缓存,但正如我所说的恕我直言。

标签: android


【解决方案1】:

通过创建一个 zip 文件、将其放入我的应用程序的原始文件或资产中,并在用户首次打开应用程序时解压缩它,我获得了非常好的、一致的结果。我建议您再试一次,因为我印象深刻的是,我已经看到数百次安装的零问题。

我基于帮助方法压缩和解压缩文件的教程在这里: Unzipping Files w/ Android,和 Zipping Files w/ Android

应该注意的是,我使用 Java API 创建了包含在我的应用安装中的 zip。这可能就是为什么我使用 Android 中的 Java API 解压后也能得到如此一致的结果。

希望这会有所帮助!祝你好运!

【讨论】:

    【解决方案2】:

    12mb 应该会节省一点,如果您使用其他 SO question 的方法,请尝试像这样增加 copyFile 中的缓冲区大小,

    private void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[8192]; // 1024 is kind small,..try 8192 or 4096!!
        int read;
        while((read = in.read(buffer)) != -1){
          out.write(buffer, 0, read);
        }
    }
    

    【讨论】:

    • 增加缓冲区大小会导致低端设备出现问题吗?
    • 如果它太大了,是的....但我使用 8192(对于低端来说应该没问题),因为我的大部分东西都出现了雷电,因为我的这个错误是 htc 制造的。 stackoverflow.com/questions/5358014/…
    • 我的应用支持 android 2.2 及更高版本,虽然只有 1.5% 为 2.2,其余为 2.3.3 及更高版本(几乎 65% 为 4.0 及更高版本)。你认为我这样做会导致 2.2 设备出现任何问题吗?据我所知,迅雷是 2.2 还是 2.3?
    • 没有。迅雷从2.2开始,我相信它目前的安卓版本是4.03。 8192 字节的缓冲区大小在几乎所有设备上都应该不错(与 1024 相比)
    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多