Мне нужна помощь с этой проблемой. Это выглядит глупо, но я не мог его решить. У меня есть файл с чередованием записей с переменной длиной записи. Мне нужно только заменить первые 3 байта для XXX, поэтому мне нужно перестроить весь файл для этого. Проблема, которую я получаю, - это изменение длины всех записей, заполняемых «NULLS». Вот почему у меня нет способа узнать ранее количество байтов, записанных для записи.Как отредактировать запись, упорядоченную файл-файл
Например, у меня есть этот файл с тремя записями:
AAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCC
DDDDDDDDDDDDDD
Файл имеет атрибут REC 26 (равен длине второй записи). Когда я исполняю свою программу, чтобы изменить первые три буквы, файл остается, что (предположим, «п», как «нулевой символ»):
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();
Примечание: Я не могу добавить функцию, чтобы получить последний символ перед первым нулем, прежде чем писать becouse предыдущего нуля или нулей в конце записи могут быть возможными и приемлемыми. Пример (помните, "N" является "нулевым"):
AAAAAAAAAAAAAAAANN
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCNN
DDDDDDDDDDDDDDNN
Должен соответствовать этому после процесса:
XXXAAAAAAAAAAAAANN
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCNN
DDDDDDDDDDDDDDNN