سؤال

لدي الحقول التالية:

  • مراقبة المخزون (سجل 16 بايت)
    • رمز معرف المنتج (عدد صحيح - 4 بايت)
    • الكمية الموجودة في المخزون (عدد صحيح – 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 مما يسمح لك بإدارة ملفات الوصول العشوائي باستخدام القنوات.تتيح لك أساليب الحجم والموضع والاقتطاع قراءة الملفات وكتابتها بشكل عشوائي.

يرى http://www.zoftino.com/java-random-access-files للحصول على التفاصيل والأمثلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top