簡體   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