2010-07-30 13 views
5

¿Qué hay de malo en este código?
tengo un archivo RAW en mi proyecto (MP4 archivo de vídeo),
cuando hago esto, y luego i retreive archivo del archivo de tarjeta SD no son idénticas por lo que el vídeo no puede ser carga :(
¿Tiene otra forma de automaticamente copiar un archivo en bruto a sdcard?
GraciasAndroid: Copie RawFile a Sdcard (video mp4)

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(); 
} 

Respuesta

9

Si utiliza un InputStream para leer, usar un OutputStream a escribir, es decir, un FileOutputStream envuelto en BufferedOutputStream. Además, su código es bastante ineficiente, ya que solo copia un byte a la vez. Me gustaría sugerir la creación de un búfer de matriz de bytes y el uso de estos métodos de lectura/escritura pertinentes:

int BufferedInputStream.read(byte[] buffer, int offset, int length) 
void BufferedOutputStream.write(byte[] buffer, int offset, int length) 
+2

Según la nota de softam, es posible que necesite una descarga adicional() - definitivamente en el caso de BufferedOutputStream –

2

creo que debe vaciar antes de cerrar el flujo de

bufEcrivain.flush(); 
bufEcrivain.close(); 
+2

De acuerdo con los documentos, BufferedWriter.close() vuelca automáticamente. Sin embargo, no es el caso de BufferedOutputStream (de nuevo, de acuerdo con los documentos). –

+0

Aha, gracias por la información! – softarn

7

Funciona gracias

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(); 
+1

¡Gracias por publicar el código de trabajo! –

Cuestiones relacionadas