Чтение байтов из конца файла в обратном направлении до достижения условия - PullRequest
0 голосов
/ 04 марта 2020

У меня есть несколько больших (> 2Gig) файлов, которые являются двоичными до последнего такого количества байтов, после чего они представляют собой обычный текст до конца файла. По сути, это небольшой заголовок xml, за которым следует гигантская двоичная полезная нагрузка, за которой следует крошечный нижний колонтитул xml. Мне нужно найти позицию в файле границы двоичного нижнего колонтитула, записать нижний колонтитул в строку и обрезать исходный файл ТОЧНО после последнего двоичного байта.

Я начал делать это следующим образом (я не мог вырезать и вставлять напрямую из-за чувствительности рабочей среды, поэтому, пожалуйста, не будьте слишком критичны, если не компилируете для вас):

String footerString = "";
String startOfEndString = "</endTag:lastTag"
StringBuilder sb = new StringBuilder();

try(raf = new RandomAccessFile(tmpFile, "rw")) {
   raf.seek(raf.length() - 2);
   byte[] bytes = new byte[2];
   boolean readMore = true;


  while(readMore == true){
    raf.read(bytes, 0, 2);
    sb.insert(0, new String(bytes));
    footerString = sb.subString(0, new String(bytes));

   if (footerString.contains(startOfEndString)) {
      footerString = footerString.substring(footerString.indexOf(startOfEndString));
      readMore = false;
      }
  }

  FileChannel payloadChannel = raf.getChannel();
  payloadChannel.truncate(raf.length() - footerString.length());

Это не работает. Строка footerString в том виде, в котором она собрана, не содержит символов в правильном порядке. Кроме того, даже если бы я не был уверен, строка "payloadChannel.truncate (raf.length () - footerString.length ());" будет усекать файл до точно правильной позиции байта.

Я подозреваю, что есть лучший способ сделать это, но я не знаю, что это такое. Благодарен за любые идеи. Спасибо.

...