2008-10-14 8 views
4

je les champs suivants:fichier d'accès aléatoire en java

  • contrôle des stocks (16 enregistrement d'octets)
    • code d'identification de produit (int - 4 octets)
    • Quantité en stock (int - 4 octets)
    • Prix (double - 8 octets)

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

J'ai essayé d'autres exemples et je ne comprenais pas très bien le concept. J'essaye un projet avec et j'essaierai d'explorer plus dessus.

Voici quelques exemples de données. Il peut y avoir des trous dans les données où No. in 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.

Répondre

10

java.io.RandomAccessFile est la classe que vous cherchez. Voici un exemple de mise en œuvre (vous aurez probablement envie d'écrire des tests unitaires, comme je ne l'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(); 
     } 
    } 
} 
+0

awesome thanks man – user21968