3 votes

Comment utiliser un délimiteur de chunk dans un fichier de données brutes ?

Je veux enregistrer des morceaux de données brutes dans un fichier, et plus tard lire ces morceaux un par un. Ce n'est pas un gros problème, sauf le doute suivant :

Quels octets exacts utiliser comme délimiteur, c'est-à-dire pour identifier la fin d'un morceau et le début du suivant ? Étant donné que les données du chunk peuvent également contenir une telle séquence d'octets par hasard.

Remarques : les chunks sont de taille variable et contiennent des données aléatoires. Ils sont jpeg des images en fait.

3voto

Stephan Markwalder Points 223

Vous pourriez d'abord écrire la longueur du morceau dans le fichier comme une valeur de taille fixe, par exemple un entier de 4 octets, suivi des données elles-mêmes :

public void appendChunk(byte[] data, File file) throws IOException {
    DataOutputStream stream = null;
    try {
        stream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file, true)));
        stream.writeInt(data.length);
        stream.write(data);
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                // ignore
            }
        }
    }
}

Si vous devez ensuite relire les morceaux de ce fichier, vous commencez par lire la longueur du premier morceau. Vous pouvez maintenant décider de lire les données du chunk ou de les ignorer et de passer au chunk suivant.

public void processChunks(File file) throws IOException {
    DataInputStream stream = null;
    try {
        stream = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
        while (true) {
            try {
                int length = stream.readInt();
                byte[] data = new byte[length];
                stream.readFully(data);
                // todo: do something with the data
            } catch (EOFException e) {
                // end of file reached
                break;
            }
        }
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                // ignore
            }
        }
    }
}

Vous pouvez également ajouter d'autres méta-données sur les chunks, comme écrire le nom original du fichier avec stream.writeUTF(...). Vous devez simplement vous assurer que vous écrivez et lisez les mêmes données dans le même ordre.

1voto

jlordo Points 22012

Créez un 2ème fichier dans lequel vous enregistrez les byteranges de vos chunks dans le chunkfile, ou ajoutez cette information dans l'en-tête de votre chunkfile. J'ai fait quelque chose de similaire une fois, n'oubliez pas que les byteranges ont le décalage supplémentaire de la longueur de l'en-tête.

int startbyte = 0;
int lastByte = 0;
int chunkcount = 0;
File chunkfile;
File structurefile;
for (every chunk) {
    append chunk to chunkfile
    lastByte = startByte + chunk.sizeInBytes()
    append to structurefile: chunkcount startByte lastByte
    chunkcount++;
    startByte = lastByte + 1
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X