2010-07-30 19 views
5

Cosa c'è di sbagliato in questo codice?
Ho un file raw nel mio progetto (mp4 file video),
quando faccio questo, e poi ho retreive file da file di SDcard non sono identiche in modo video non può essere carico :(
Avete un altro modo per automaticly copiare un file raw per sdcard?
GrazieAndroid: copia RawFile su 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(); 
} 

risposta

9

Se si utilizza un InputStream leggere, utilizzare un OutputStream per scrivere, cioè un FileOutputStream con BufferedOutputStream. Inoltre, il tuo codice è piuttosto inefficiente, poiché copia solo un byte alla volta. Io suggerirei di creare un buffer di array di byte e l'utilizzo di questi importanti metodi di lettura/scrittura:

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

Come da nota del Softam, potrebbe essere necessario un ulteriore flush() - sicuramente nel caso di BufferedOutputStream –

2

credo che si dovrebbe sciacquare prima di chiudere il flusso

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

Secondo la documentazione, BufferedWriter.close(), vampate automaticamente. Non è il caso di BufferedOutputStream (di nuovo, secondo i documenti). –

+0

Aha, grazie per le informazioni! – softarn

7

Funziona, grazie

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

Grazie per aver pubblicato il codice funzionante! –

Problemi correlati