Frage

Ich habe folgende Felder:

  • Lagerverwaltung (16 Byte Datensatz)
    • Product ID-Code (int - 4 Byte)
    • Menge auf Lager (int - 4 Byte)
    • Preis (Doppel - 8 Byte)

Wie erstelle ich eine feste Länge Random Access-Datei der oben genannten Längen verwendet? Ich habe versucht, ein paar Beispiele online, aber ich entweder eine EOF Ausnahme oder zufällige Adresse Werte erhalten, wenn ich versuche, auf sie zuzugreifen.

Ich habe versucht, einige weitere Beispiele und konnte das Konzept nicht sehr gut verstehen. Ich versuche, ein Projekt mit ihm und werden versuchen, mehr auf sie zu erforschen.

Hier einige Beispieldaten. Es könnte Löcher in den Daten sein, wo No. in stock 23 == 023 werden.

          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

Danke für die Hilfe.

War es hilfreich?

Lösung

java.io.RandomAccessFile ist die Klasse, die Sie suchen. Hier ist ein Beispiel-Implementierung (Sie werden wahrscheinlich wollen einige Unit-Tests schreiben, da ich nicht:)

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();
        }
    }
}

Andere Tipps

Mit dem letzten Java-Versionen können Sie Random Access-Dateien mit Filechannel verwalten. SeekableByteChannel Schnittstelle definiert Methoden, die ermöglichen, die Position des Zeigers in der Zieleinheit wie Datei zu ändern, die der Kanal angeschlossen ist. Filechannel implementiert SeekableByteChannel so dass Sie Random Access-Dateien unter Verwendung von Kanälen verwalten. Methoden Größe, Position, gestutzt können Sie Dateien in zufälliger Reihenfolge lesen und schreiben.

finden Sie unter http://www.zoftino.com/java-random-access- Dateien für Details und Beispiele.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top