Предполагая, что ваш формат похож на
{string possibly with spaces} {integer}\r?\n
Вам нужно найти новую строку и работать в обратном направлении, пока не найдете первый пробел. Вы можете самостоятельно расшифровать число и превратить его в int
или превратить в строку и проанализировать. Я бы не использовал Integer, если бы вам не пришлось. Теперь вы знаете, где находится начало строки и начало целого числа, вы можете извлечь строку в виде байтов и преобразовать ее в строку, используя желаемую кодировку.
Это предполагает, что символ новой строки и пробел являются одним байтом в вашей кодировке. Было бы сложнее, если бы они были многобайтовыми байтами, это еще можно сделать.
РЕДАКТИРОВАТЬ: следующий пример печатает ...
text: ' someString', number: 8
text: 'some other string', number: -88
код
ByteBuffer bb = ByteBuffer.wrap(" someString 8\r\nsome other string -88\n".getBytes());
while(bb.remaining()>0) {
int start = bb.position(),end, ptr;
for(end = start;end < bb.limit();end++) {
byte b = bb.get(end);
if (b == '\r' || b == '\n')
break;
}
// read the number backwards
long value = 0;
long tens = 1;
for(ptr = end-1;ptr>= start;ptr--) {
byte b = bb.get(ptr);
if (b >= '0' && b <= '9') {
value += tens * (b - '0');
tens *= 10;
} else if (b == '-') {
value = -value;
ptr--;
break;
} else {
break;
}
}
// assume separator is a space....
byte[] bytes = new byte[ptr-start];
bb.get(bytes);
String text = new String(bytes, "UTF-8");
System.out.println("text: '"+text+"', number: "+value);
// find the end of the line.
if (bb.get(end) == '\r') end++;
bb.position(end+1);
}