【问题标题】:How to edit a entry sequenced enscribe file如何编辑条目排序的 enscribe 文件
【发布时间】:2015-09-26 01:08:38
【问题描述】:

我需要一些帮助来解决这个问题。它看起来很愚蠢,但我无法解决它。我有一个带有可变长度记录的条目序列文件。我只需要替换 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

【问题讨论】:

    标签: java tandem


    【解决方案1】:

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

    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();
    

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 1970-01-01
      • 2022-01-10
      • 2020-07-08
      • 2017-11-09
      • 1970-01-01
      • 2015-08-11
      • 2014-01-05
      • 1970-01-01
      相关资源
      最近更新 更多