Как найти начало последней строки в файле?
Задача: Найти начало (номер байта) последней строки в файле. С помощью FileChannel берём по порции байтов с конца файла и всё вроде бы работает.
public long findingStartLastLine(){
//How many bytes to take from line
byte[] buffer = new byte [41];
long position=0;
try {
RandomAccessFile raf = new RandomAccessFile(path, "r");
FileChannel channel = raf.getChannel();
ByteBuffer arrayBytes = ByteBuffer.wrap(buffer);
Path filePath = Paths.get(path);
long size = Files.size(filePath);
position=size-buffer.length;
long pointer=0;
String line;
//finding position beginning line from end to file
while(position>0) {
channel.read(arrayBytes, position);
line = new String(buffer);
line=line.trim();
pointer+=line.length();
position=size-pointer;
if(line.indexOf("\n")!=-1) {
position=pointer-line.indexOf("\n");
raf.seek(size-position);
line=raf.readLine();
position=raf.getFilePointer();
break;
}
arrayBytes.clear();
}
if(position<0)
position=0;
raf.seek(position);
line = raf.readLine();
channel.close(); raf.close();
String utf8 = new String(line.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("UTF-8: " + utf8);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return position;
}
Проблема заключается в строке line=line.trim(); Если во время чтения очередной порции байтов курсор встанет перед началом слова, захватив пробел между предыдущим словом, то после обрезания пробелов pointer будет неправильно считать позицию. Если убрать trim(), то может получиться ситуация - буфер больше длины строки. В итоге лишние пробелы и неправильный расчёт позиции... Как можно обыграть данную ситуацию и найти начало последней строки в файле, чтоб не считать по 1 байту?
Ответы (1 шт):
String inString = "One. Ywo. three. Four.";
int lastpoint = inString.lastIndexOf(".");
String buf = inString.substring(0, lastpoint);
System.out.println(buf.lastIndexOf("."));
Я все таки наверное не правильно понял задачу. Не понятно. Если все строки заканчиваются точкой, все строки и последняя,то что мешает найти последнюю точку и предпоследнюю? Можно просто удалить последнюю точку и тогда предпоследняя точка будет последней. И от этой точки взять те самые байты