2010-07-30 13 views
5

Quel est le problème sur ce code?
J'ai un fichier Raw dans mon projet (mp4 videofile),
quand je fais ça, puis je retreive fichier à partir du fichier SDcard ne sont pas identiques si la vidéo ne peut pas être charge :(
Avez-vous une autre façon de copier automatiquement un fichier brut SDCard?
MerciAndroid: Copier RawFile à Sdcard (vidéo 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(); 
} 

Répondre

9

Si vous utilisez un InputStream pour lire, utiliser un OutputStream écrivez, c'est-à-dire un FileOutputStream enveloppé dans un BufferedOutputStream. En outre, votre code est assez inefficace, car il ne copie qu'un octet à la fois. Je vous suggère de créer un tampon de tableau d'octets et l'utilisation de ces méthodes de lecture/écriture pertinentes:

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

Selon la note de softam, vous pouvez avoir besoin d'un flush supplémentaire() - certainement dans le cas de BufferedOutputStream –

2

Je pense que vous devriez rincer avant de fermer le flux

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

Selon les docs, BufferedWriter.close() Bouffées automatiquement. Ce n'est pas le cas pour BufferedOutputStream (encore une fois, selon les docs). –

+0

Aha, merci pour l'info! – softarn

7

Il fonctionne grâce

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

Merci d'avoir posté le code de travail! –