Затем данные, которые я хочу проанализировать, разделены знаком «@». Моя идея - изменить символ конца строки по умолчанию, используемый Java ans set "@".
Я бы этого не сделал, так как это может сломаться, Бог знает, что еще это зависит от line.separator.
Что касается причин, по которым это не работает, извините, что это случай, когда RTFM не выполняется. Это то, что Javadocs для BufferedReader.readLine должен сказать:
public String readLine()
throws IOException
Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.
Returns: A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached
Throws: IOException - If an I/O error occurs
В API Docs для метода readLine()
ясно говорит, что он ищет '\n'
или '\r'
. Он не говорит, что это зависит от line.separator
.
Свойство line.separator
предназначено только для разработки API-интерфейсов, которым необходим переносимый, независимый от платформы механизм, который идентифицирует разделители строк. Вот и все. Это системное свойство не является для управления внутренними механизмами классов ввода-вывода Java.
Я думаю, что вы слишком усложняете ситуацию.Просто делайте это по-старому, читая n-число символов (скажем 1024KB) в буфере и сканируйте каждый разделитель @. Это приводит к осложнениям, таким как обычные случаи, когда данные между разделителями «@» становятся разделенными между буферами.
Итак, я хотел бы предложить только прочитать один символ от буферного читателя (это не так уж плохо, и как правило, не ударил IO избыточно, так как буферном читатель делает ... тад ... буферизации для вас.)
Направьте каждый символ в построитель строк, и каждый раз, когда вы обнаружите разделитель «@», вы очищаете содержимое строкового конструктора до стандартного вывода или что-то в этом роде (поскольку это будет представлять собой привязку с вашего файла «@».)
Сначала попробуйте алгоритм работать правильно. Оптимизируйте позже. Ниже приведен псевдокод, нет гарантий, что ошибок компиляции нет. Вы должны быть в состоянии тривиальной плоти его в синтаксический правильной Java:
File testFile = new File("./Mypath/myfile");
int buffer_size = 1024 * 1024
BufferedReader br = new BufferedReader(new FileReader(testFile), buffer_size);
StringBuilder bld = StringBuilder();
int c = br.read();
while(c != -1){
char z = (char)c;
if(z == '@'){
System.out.println(bld);
if(bld.length() > 0){
bld.delete(0, bld.length() - 1);
}
} else {
bld.append(z);
}
}
'BufferedReader' не использует' line.separator'. Проверка на '\ n' и' \ r', кажется, жестко закодирована там. – Tom