【发布时间】: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