java中的随机访问文件
我有以下字段:java中的随机访问文件,java,random-access,Java,Random Access,我有以下字段: 库存控制(16字节记录) 产品ID代码(整数–4字节) 库存数量(整数–4字节) 价格(双字节–8字节) 如何使用上述长度创建固定长度的随机访问文件?我在网上尝试了一些示例,但在尝试访问它们时,我要么得到EOF异常,要么得到随机地址值 我尝试了更多的例子,不能很好地理解这个概念。我正在尝试一个项目与它,并将试图探索更多的关于它 下面是一些示例数据。数据中可能有漏洞,No.in stock可能是23==023 Quantity ID. No. In
- 库存控制(16字节记录)
- 产品ID代码(整数–4字节)
- 库存数量(整数–4字节)
- 价格(双字节–8字节)
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是您要查找的类。下面是一个示例实现(您可能需要编写一些单元测试,而我没有:)
对于最新的Java版本,您可以使用FileChannel管理随机访问文件。SeekableByteChannel接口定义了允许您更改指针在目标实体(如通道连接到的文件)中的位置的方法。FileChannel实现SeekableByteChannel,允许您使用通道管理随机访问文件。方法size、position和truncate允许您随机读取和写入文件 有关详细信息和示例,请参见
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();
}
}
}