файл произвольного доступа в Java - PullRequest
4 голосов
/ 14 октября 2008

У меня есть следующие поля:

  • Управление запасами (запись 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

Спасибо за помощь.

Ответы [ 2 ]

10 голосов
/ 14 октября 2008

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();
        }
    }
}
0 голосов
/ 26 мая 2018

В последних версиях Java вы можете управлять файлами произвольного доступа с помощью FileChannel. Интерфейс SeekableByteChannel определяет методы, которые позволяют изменять положение указателя в целевом объекте, таком как файл, к которому подключен канал. FileChannel реализует SeekableByteChannel, позволяя вам управлять файлами произвольного доступа с использованием каналов. Методы size, position, truncate позволяют произвольно читать и записывать файлы.

см. http://www.zoftino.com/java-random-access-files для подробностей и примера.

...