Random Access-Datei in java
-
11-07-2019 - |
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.
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.