7
votes

Java: Comment "couper" un tableau d'octets?

J'ai donc un certain code qui lit une certaine quantité d'octets à partir d'un fichier et renvoie le tableau d'octets résultant (ceci est essentiellement utilisé pour la perte de fichiers pour envoyer sur le réseau (finalement) le texte ASCII codé de base64). Cela fonctionne bien, sauf que lorsque le dernier morceau du fichier est généré, ce n'est pas un morceau complet. Par conséquent, le tableau d'ortets résultant n'est pas complet. Cependant, il s'agit d'une taille constante, ce qui signifie que le fichier est réassemblé qu'il y a un tas de données supplémentaires (0's peut-être) ajouté à la fin. P>

Comment puis-je le faire pour que l'octet [] Pour que le dernier morceau du fichier ne contient vraiment que les données nécessaires? Le code ressemble à ceci: p>

 private byte[] readData(File f, int startByte, int chunkSize) throws Exception {
    RandomAccessFile raf = new RandomAccessFile(f, "r");
    raf.seek(startByte);
    byte[] data = new byte[chunkSize];
    raf.read(data);        
    raf.close();
    return data;
}


0 commentaires

3 Réponses :


2
votes

aléatoireAccessfile.read () code> renvoie le nombre de bytes Lire, de sorte que vous pouvez copier le tableau si nécessaire:

byte[] r = new byte[read];
System.arraycopy(data, 0, r, 0, read);
return r;


0 commentaires

5
votes

Vous devrez vérifier la valeur de retour de randomAccessfile.read () code> pour déterminer le nombre d'octets lus. Si c'est différent que le morceau, vous devrez copier la matrice à un plus petit et retourner cela.

private byte[] readData(File f, int startByte, int chunkSize) throws Exception {
    RandomAccessFile raf = new RandomAccessFile(f, "r");
    raf.seek(startByte);
    byte[] data = new byte[chunkSize];
    int bytesRead = raf.read(data);
    if (bytesRead != chunkSize) {
         byte[] smallerData = new byte[bytesRead];
         System.arraycopy(data, 0, smallerData, 0, bytesRead);
         data = smallerData;
    }
    raf.close();
    return data;
}


5 commentaires

Utilisation de tableaux.copyof de la poste ci-dessus au lieu de System.ArrayCopy (qui a jeté une exception), cela a parfaitement fonctionné! Merci!


Corrigé, j'ai eu une faute de frappe dans la comparaison, aurait dû utiliser == pas = .


@Erin Drummond: Quelle était l'exception projetée par système.arrayCopy () ?


c'était une indexOutOfboundSException IIRC


@Erin Drummond: Je vois pourquoi cela se passait et corrigé ma réponse. Le dernier argument à SYSTEM.ARRAYCOPYCOPY () doit être BYTESREAD , pas ChunkSize . Duh! Désolé pour ça. Veuillez essayer avec ma réponse mise à jour et confirmer qu'il est corrigé. Merci :)



0
votes

Vous pouvez également utiliser la taille du fichier pour calculer le nombre restant d'octets. xxx

de cette façon, vous ne créez pas de tableau supplémentaire et n'a pas besoin de la copie. Probablement pas un impact important.
Un point important Imo: Vérifiez la valeur renvoyée par Lire , je pense que cela peut être inférieur aux octets restants. Les états Javadoc:

Le nombre d'octets lus est, au plus, égal à la longueur de B


0 commentaires