Question

J'ai les champs suivants:

  • Contrôle des stocks (enregistrement de 16 octets)
    • Code d'identification du produit (int & # 8211; 4 octets)
    • Quantité en stock (int & # 8211; 4 octets)
    • Prix (double & # 8211; 8 octets)

Comment créer un fichier à accès aléatoire de longueur fixe en utilisant les longueurs ci-dessus? J'ai essayé quelques exemples en ligne, mais j'obtiens une exception EOF ou des valeurs d'adresse aléatoires lorsque j'essaie d'y accéder.

J'ai essayé quelques exemples supplémentaires et je ne comprenais pas très bien le concept. J'essaie un projet avec elle et j'essaierai d'en explorer davantage.

Voici quelques exemples de données. Il peut y avoir des trous dans les données où Non. en stock pourrait être 23 == 023 .

          Quantity
ID. No.   In Stock   Price

-------   --------   ------
 1001       476      $28.35
 1002       240      $32.56
 1003       517      $51.27
 1004       284      $23.75
 1005       165      $32.25

Merci pour l'aide.

Était-ce utile?

La solution

java.io.RandomAccessFile est la classe que vous recherchez. Voici un exemple de mise en oeuvre (vous voudrez probablement écrire quelques tests unitaires, ce que je n’ai pas fait:)

package test;

import java.io.IOException;
import java.io.RandomAccessFile;

public class Raf {
    private static class Record{
        private final double price;
        private final int id;
        private final int stock;

        public Record(int id, int stock, double price){
            this.id = id;
            this.stock = stock;
            this.price = price;
        }

        public void pack(int n, int offset, byte[] array){
            array[offset + 0] = (byte)(n & 0xff);
            array[offset + 1] = (byte)((n >> 8) & 0xff);
            array[offset + 2] = (byte)((n >> 16) & 0xff);
            array[offset + 3] = (byte)((n >> 24) & 0xff);
        }

        public void pack(double n, int offset, byte[] array){
            long bytes = Double.doubleToRawLongBits(n);
            pack((int) (bytes & 0xffffffff), offset, array);
            pack((int) ((bytes >> 32) & 0xffffffff), offset + 4, array);
        }

        public byte[] getBytes() {
            byte[] record = new byte[16];
            pack(id, 0, record);
            pack(stock, 4, record);
            pack(price, 8, record);
            return record;
        }
    }

    private static final int RECORD_SIZE = 16;
    private static final int N_RECORDS = 1024;

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile(args[0], "rw");
        try{
            raf.seek(RECORD_SIZE * N_RECORDS);

            raf.seek(0);

            raf.write(new Record(1001, 476, 28.35).getBytes());
            raf.write(new Record(1002, 240, 32.56).getBytes());
        } finally {
            raf.close();
        }
    }
}

Autres conseils

Avec les versions récentes de Java, vous pouvez gérer les fichiers à accès aléatoire à l’aide de FileChannel. L’interface SeekableByteChannel définit des méthodes qui vous permettent de modifier la position du pointeur dans l’entité de destination, comme le fichier auquel le canal est connecté. FileChannel implémente SeekableByteChannel pour vous permettre de gérer des fichiers à accès aléatoire à l'aide de canaux. Les méthodes size, position, truncate vous permettent de lire et d’écrire des fichiers de manière aléatoire.

voir http://www.zoftino.com/java-random-access- fichiers pour plus de détails et d’exemples.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top