繁体   English   中英

java中的随机访问文件

[英]random access file in java

我有以下字段:

  • 库存控制(16 字节记录)
    • 产品 ID 代码(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 允许您使用通道管理随机访问文件。 方法大小、位置、截断允许您随机读取和写入文件。

有关详细信息和示例,请参阅http://www.zoftino.com/java-random-access-files

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM