2015-09-26 3 views
0

Мне нужна помощь с этой проблемой. Это выглядит глупо, но я не мог его решить. У меня есть файл с чередованием записей с переменной длиной записи. Мне нужно только заменить первые 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 

ответ

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(); 
Смежные вопросы