Это немного похоже на проблему xy , так как чтение файла « строка за строкой » уже является частью вашего попытки решения, в то время как фактическая задача не включает каких-либо требований к читать файл «построчно».
На самом деле вы хотите обработать все шестнадцатеричные числа источника, независимо от ограничителей строки, что является заданием для java.util.Scanner
. Он также позволяет обрабатывать элементы с помощью Stream API, хотя эта конкретная задача не приносит от этого большой пользы по сравнению с циклом:
ByteBuffer bb = ByteBuffer.allocate(1024);
try(Scanner s = new Scanner(yourFile)) {
s.findAll("[0-9A-Fa-f]{2}")
.mapToInt(m -> Integer.parseInt(m.group(), 16))
.forEachOrdered(i -> { if(bb.hasRemaining()) bb.put((byte)i); });
}
try(Scanner s = new Scanner(yourFile)) {
Pattern p = Pattern.compile("[0-9A-Fa-f]{2}");
for(;;) {
String next = s.findWithinHorizon(p, 0);
if(next == null) break;
if(!bb.hasRemaining()) // the thing hard to do with Stream API
bb = ByteBuffer.allocate(bb.capacity()*2).put(bb.flip());
bb.put((byte)Integer.parseInt(next, 16));
}
}
Обратите внимание, что в этих примерах используется Java 9. В Java 8 для Buffer
, возвращаемого Buffer.flip()
, требуется тип, приведенный к ByteBuffer
, а Scanner.findAll
недоступен, но должен быть заменен резервным портом. как в этот ответ .