Android:将RawFile复制到Sdcard(视频mp4)

5

这段代码有什么问题?
我的项目中有一个原始文件(MP4视频文件),
当我这样做时,然后从SD卡检索文件,文件不相同,因此无法加载视频:(
你有另一种自动复制原始文件到SD卡的方法吗?
谢谢

String FICHIER_BLOW = "blowvid4.mp4";
File f=new File(Environment.getExternalStorageDirectory(), FICHIER_BLOW);
try {
    if (f.createNewFile()){
    FileWriter ecrivain = new FileWriter(f);
    BufferedWriter bufEcrivain = new BufferedWriter(ecrivain);
    BufferedInputStream VideoReader = new BufferedInputStream(getResources().openRawResource(R.raw.blow));
    while( VideoReader.available() > 0 ){
        bufEcrivain.write(VideoReader.read());
    }
    bufEcrivain.close();

    VideoView videoView = (VideoView) findViewById(R.id.VideoView);
    MediaController mediaController = new MediaController(this);
    mediaController.setAnchorView(videoView);
    video =Uri.fromFile(f);
    videoView.setMediaController(mediaController);
    videoView.setVideoURI(video);
    videoView.start();
    }
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
3个回答

9
如果您使用InputStream进行读取,请使用OutputStream进行写入,即使用BufferedOutputStream封装FileOutputStream。此外,您的代码效率相当低下,因为它只能一次复制一个字节。我建议创建一个字节数组缓冲区,并使用以下相关的读/写方法:
int BufferedInputStream.read(byte[] buffer, int offset, int length)
void BufferedOutputStream.write(byte[] buffer, int offset, int length)

2
根据softam的注释,您可能需要额外的flush() -- 尤其是在BufferedOutputStream的情况下。 - Roman Nurik

7

它能正常工作,谢谢。

BufferedOutputStream bufEcrivain = new BufferedOutputStream((new FileOutputStream(f)));
BufferedInputStream VideoReader = new BufferedInputStream(getResources().openRawResource(R.raw.blow));
byte[] buff = new byte[32 * 1024];
int len;
while( (len = VideoReader.read(buff)) > 0 ){
    bufEcrivain.write(buff,0,len);
}
bufEcrivain.flush();
bufEcrivain.close();

2

在关闭流之前,我认为你应该先刷新缓冲区。

bufEcrivain.flush();
bufEcrivain.close();

2
根据文档,BufferedWriter.close() 会自动刷新缓冲区。但是 BufferedOutputStream 并非如此(同样来自文档)。 - Roman Nurik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接