【问题标题】:How to copy files in Android from sdcard to internal storage without corrupting them如何将Android中的文件从SD卡复制到内部存储而不损坏它们
【发布时间】:2012-05-23 06:30:27
【问题描述】:

我的程序需要复制位于 sd 卡文件夹中的两个文件(.ogg 声音文件)以缓存通过 getCacheDir() 返回的应用程序目录

我使用以下代码复制文件

File cache=this.getCacheDir();
cache.mkdirs();
fout=new FileOutputStream(cache.getAbsolutePath()+"/file1.ogg");
fin=new FileInputStream(Environment.getExternalStorageDirector+"/imported/file1.ogg");

byte[] buf = new byte[128];
int len;
while ((len = fin.read(buf,0,128))>-1){
    fout.write(buf, 0, len);
}

fout.close();
fin.close();    

代码编译并运行没有任何错误,两个文件都被复制并具有与原始文件相同的大小, 但是当我的程序尝试播放那些 .ogg 文件时,当我尝试在我的电脑中播放复制的文件时,也会发生 IO 异常。

但是,如果我将它们从一个文件夹复制到 SD 卡上的另一个文件夹,它可以正常播放。 这意味着从外部媒体复制到外部媒体是可以的,但从外部媒体复制到内部会导致损坏!

编辑

这是我从实验和观察中发现的:

A) 以编程方式将原始文件复制到内部存储 -> 无法播放文件

B) 将原始文件直接复制到内部存储(我有 root 访问权限)-> 播放正常

C) 将程序复制的文件直接复制回 sd 卡中的任何位置 -> 再次播放正常(太棒了!)

注意:-这里直接复制是指使用 Android 操作系统的复制粘贴

在我看来,复制的文件在复制后无法正常工作,但是一旦将其移动到 sd 卡,它就会再次开始工作。

FTW 人!

【问题讨论】:

  • 具有相同的 size 并不意味着 contents 相同。你说复制的文件不能在你的电脑上播放。使用文件比较程序逐字节比较文件。
  • 它们不一样..我用记事本查看了它们显示不同的数据!
  • 记事本不是文件比较程序。如果您逐字节查看实际的差异,您可能会发现为什么会发生这种情况的线索。
  • 复制的文件既不能在设备上播放,也不能在 PC 上播放,而 原始文件可以正常播放
  • 你能给我推荐一个吗?无论如何,记事本中的字符模式对于原始和复制是不同的。但是对于从 sd 卡复制到 sdcard 的任何文件,显示相同的模式足以证明它们在第一种情况下不一样

标签: java android android-sdcard ioexception file-handling


【解决方案1】:

答案可能是您使用的是缓存而不是内部存储器。不保证缓存。

【讨论】:

  • 你确定!但缓存的目的是为了不破坏文件
猜你喜欢
  • 1970-01-01
  • 2020-02-22
  • 2020-01-11
  • 2017-07-20
  • 1970-01-01
  • 2012-05-16
  • 2015-09-14
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多