2009-09-24 7 views
2

J'ai essayé de créer des blocs de tableaux d'octets à partir d'un fichier alors que le processus utilisait encore le fichier pour l'écriture. En fait, je stocke la vidéo dans un fichier et je voudrais créer des morceaux à partir du même fichier pendant l'enregistrement.Comment diviser un fichier en morceaux tout en l'écrivant?

La méthode suivante était censé lire des blocs d'octets de fichier:

private byte[] getBytesFromFile(File file) throws IOException{ 
    InputStream is = new FileInputStream(file); 
    long length = file.length(); 

    int numRead = 0; 

    byte[] bytes = new byte[(int)length - mReadOffset]; 
    numRead = is.read(bytes, mReadOffset, bytes.length - mReadOffset); 
    if(numRead != (bytes.length - mReadOffset)){ 
     throw new IOException("Could not completely read file " + file.getName()); 
    } 

    mReadOffset += numRead; 
    is.close(); 
    return bytes; 
} 

Mais le problème est que tous les éléments du tableau sont à 0 et je suppose que c'est parce que le processus d'écriture verrouille le fichier.

Je serais très reconnaissant si quelqu'un d'entre vous pourrait montrer n'importe quel autre moyen de créer des morceaux de fichier tout en écrivant dans le fichier.

+0

en double de http://stackoverflow.com/questions/1470600/android-reading-bytes-from-file-with-one-process-while-another-process- is-writin –

+2

@stephen: page non trouvée. – Chii

+0

Est-ce que votre propre application écrit le fichier vidéo (vous l'avez écrit)? Ou essayez-vous de découper la sortie d'une application étrangère? –

Répondre

5

résolu le problème:

private void getBytesFromFile(File file) throws IOException { 
    FileInputStream is = new FileInputStream(file); //videorecorder stores video to file 

    java.nio.channels.FileChannel fc = is.getChannel(); 
    java.nio.ByteBuffer bb = java.nio.ByteBuffer.allocate(10000); 

    int chunkCount = 0; 

    byte[] bytes; 

    while(fc.read(bb) >= 0){ 
     bb.flip(); 
     //save the part of the file into a chunk 
     bytes = bb.array(); 
     storeByteArrayToFile(bytes, mRecordingFile + "." + chunkCount);//mRecordingFile is the (String)path to file 
     chunkCount++; 
     bb.clear(); 
    } 
} 

private void storeByteArrayToFile(byte[] bytesToSave, String path) throws IOException { 
    FileOutputStream fOut = new FileOutputStream(path); 
    try { 
     fOut.write(bytesToSave); 
    } 
    catch (Exception ex) { 
     Log.e("ERROR", ex.getMessage()); 
    } 
    finally { 
     fOut.close(); 
    } 
} 
0

Si c'était moi, je l'aurais chunked par le processus/fil d'écriture dans le fichier. C'est comme ça que Log4j semble le faire, en tout cas. Il devrait être possible de créer un OutputStream qui commence automatiquement à écrire dans un nouveau fichier tous les N octets.

Questions connexes