0

この問題について助けが必要です。ばかげているように見えますが、解決できませんでした。可変長レコードを含むエントリ順ファイルがあります。XXX の最初の 3 バイトを置き換えるだけでよいので、このためにファイル全体を再構築する必要があります。そのため、レコードに書き込まれたバイト数を以前に知る方法がありません。

たとえば、次の 3 つのレコードを含むファイルがあります。

AAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCC
DDDDDDDDDDDDDD

ファイルの REC 属性は 26 (2 番目のレコードの長さに等しい) です。プログラムを実行して最初の 3 文字を変更すると、ファイルはそのままになります (「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
4

1 に答える 1

0

わかりました、他のフォーラムで解決策を見つけました。とてもシンプルです。この方法

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();
于 2015-09-29T21:20:44.557 に答える