Java 如何将Android中的文件从SD卡复制到内部存储而不损坏它们

Java 如何将Android中的文件从SD卡复制到内部存储而不损坏它们,java,android,android-sdcard,ioexception,file-handling,Java,Android,Android Sdcard,Ioexception,File Handling,我的程序需要将sd卡文件夹中的两个文件(.ogg声音文件)复制到应用程序的缓存目录中,该目录通过getCacheDir()返回 我使用以下代码来复制文件 File cache=this.getCacheDir(); cache.mkdirs(); fout=new FileOutputStream(cache.getAbsolutePath()+"/file1.ogg"); fin=new FileInputStream(Environment.getExternalStorageDirecto

我的程序需要将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) 将原始文件直接复制到内部存储(我有根访问权限)->效果良好

C) 将编程复制的文件直接复制回sd卡中的任何位置->再次播放效果良好(惊人!)

注意:-此处直接复制意味着使用Android操作系统的复制粘贴

在我看来,复制的文件在复制后不起作用,但一旦被移动到sd卡上,它又开始工作了


FTW人

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

大小相同并不意味着内容相同。你说复制的文件不能在你的电脑上播放。用文件比较程序逐字节比较这些文件。它们不一样。。我用记事本查看了这两个版本,它们显示了不同的数据!记事本不是一个文件比较程序。如果您查看每个字节的实际差异,您可能会发现发生这种情况的原因。复制的文件既不会在设备上播放,也不会在PC上播放,而原始文件播放得很好。您能给我推荐一个吗?无论如何,记事本中的字符模式对于原始和复制是不同的。但对于从sd卡复制到sd卡的任何文件,都会显示出相同的模式,这足以证明它们在第一种情况下是不一样的!但是缓存是为了不损坏文件