файл произвольного доступа на java
-
11-07-2019 - |
Вопрос
У меня есть следующие поля:
- Контроль запасов (16-байтовая запись)
- Идентификационный код продукта (int – 4 байта)
- Количество на складе (int – 4 байта)
- Цена (двойная – 8 байт)
Как мне создать файл произвольного доступа фиксированной длины, используя указанные выше длины?Я попробовал несколько примеров онлайн, но при попытке получить к ним доступ я получаю либо исключение EOF, либо случайные значения адресов.
Я попробовал еще несколько примеров и не смог очень хорошо понять концепцию.Я пробую проект с ним и постараюсь подробнее изучить его.
Вот некоторые примерные данные.В данных могут быть пробелы, где No. in stock
могло бы быть 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
Спасибо за помощь.
Решение
java.io.RandomAccessFile - это класс, который вы ищете.Вот пример реализации (вы, вероятно, захотите написать несколько модульных тестов, поскольку я этого не сделал :)
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();
}
}
}
Другие советы
В последних версиях Java вы можете управлять файлами произвольного доступа с помощью FileChannel.Интерфейс SeekableByteChannel определяет методы, которые позволяют вам изменять положение указателя в целевом объекте, подобном файлу, к которому подключен канал.FileChannel реализует SeekableByteChannel, позволяющий вам управлять файлами произвольного доступа с помощью каналов.Методы size, position, truncate позволяют вам читать и записывать файлы случайным образом.
видишь http://www.zoftino.com/java-random-access-files для получения подробной информации и примера.