繁体   English   中英

如何编辑顺序排序的记录文件

[英]How to edit a entry sequenced enscribe file

我需要有关此问题的帮助。 它看起来很愚蠢,但我无法解决。 我有一个带有可变长度记录的条目排序文件。 我只需要替换XXX的前3个字节,就可以为此重建整个文件。我遇到的问题是我正在更改所有用“ NULLS”填充的记录的长度。 这就是为什么我无法事先知道为该记录写入的字节数的原因。

例如,我有三个记录的文件:

AAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCC
DDDDDDDDDDDDDD

该文件的REC属性为26(等于第二条记录的长度)。 当我执行程序以更改前三个字母时,文件保持不变(假定“ n”为“空字符”):

AAAAAAAAAAAAAAAANNNNNNNNNN
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCNNNNNNNNNNNNNNNNNNNNN
DDDDDDDDDDDDDDNNNNNNNNNNNN

我如何更改程序以获得我想要的?

XXXAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCC
DDDDDDDDDDDDDD

这是我的代码(java)

EnscribeFile p_origin = new EnscribeFile(file);
String first_record;
byte buffer[]; 

//First, charge all records and then purge the file content
ArrayList<byte[]> records = new ArrayList<byte[]>();
buffer = new byte[et.getRecordLength()];
p_origin.open(EnscribeOpenOptions.READ_WRITE,EnscribeOpenOptions.SHARED);
EnscribeFileAttributes et = p_origin.getFileInfo();
while ( p_origin.read(buffer,et.getRecordLength()) != EnscribeFile.POSITION_UNUSED )
{
    byte auxRecord[] = new byte[et.getRecordLength()];
    System.arraycopy(buffer,0,auxRecord,0,et.getRecordLength());
    buffer = new byte[et.getRecordLength()];
    records.add(auxRecord);
}
p_origin.purgeData();

//Second, modify first record
first_record = new String(records.get(0));
first_record = "XXX" + first_record.substring(3);
records.set(0,first_record.getBytes());

//Third, rewrite the records and close the file
Iterator<byte[]> i = records.iterator();
while( i.hasNext() )
    p_origin.write(aux,et.getRecordLength()); //Check the note

p_origin.close();

注意:我不能添加一个函数来获取写入前第一个null之前的最后一个字符,因为在记录末尾的前一个null或可能为null。 示例(记住“ N”为“ null”):

AAAAAAAAAAAAAAAANN
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCNN
DDDDDDDDDDDDDDNN

处理后必须等于:

XXXAAAAAAAAAAAAANN
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCNN
DDDDDDDDDDDDDDNN

好的,我在其他论坛上找到了解决方案。 这很简单。 这个方法

p_origin.read(...)

返回我不知道的字节长度,因此在创建新记录之前将变量保存为长度非常简单。 经过一些更改,代码变为:

EnscribeFile p_origin = new EnscribeFile(file);
String first_record;
byte buffer[]; 

//First, charge all records and then purge the file content
ArrayList<byte[]> records = new ArrayList<byte[]>();
buffer = new byte[et.getRecordLength()];
p_origin.open(EnscribeOpenOptions.READ_WRITE,EnscribeOpenOptions.SHARED);
EnscribeFileAttributes et = p_origin.getFileInfo();
int aux_len = p_origin.read(buffer,et.getRecordLength());
while ( aux_len != EnscribeFile.POSITION_UNUSED )
{
    byte auxRecord[] = new byte[aux_len];
    System.arraycopy(buffer,0,auxRecord,0,et.getRecordLength());
    records.add(auxRecord);
    aux_len = p_origin.read(buffer,et.getRecordLength());
}
p_origin.purgeData();

//Second, modify first record
first_record = new String(records.get(0));
first_record = "XXX" + first_record.substring(3);
records.set(0,first_record.getBytes());

//Third, rewrite the records and close the file
Iterator<byte[]> i = records.iterator();
while( i.hasNext() )
{
    byte aux_byte[] = i.next();
    p_origin.write(aux_byte,aux_byte.length);
}

p_origin.close();

暂无
暂无

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

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