Мне нужно прочитать файл по одному символу за раз, и я использую метод read()
от BufferedReader
. *
Я обнаружил, что read()
примерно в 10 раз медленнее, чем readLine()
. Ожидается ли это? Или я делаю что-то неправильно?
Здесь контрольный показатель с Java 7. Входной тестовый файл содержит около 5 миллионов строк и 254 миллиона символов (~ 242 МБ) **:
Метод read()
занимает около 7000 мс для чтения всех символов:
@Test
public void testRead() throws IOException, UnindexableFastaFileException{
BufferedReader fa= new BufferedReader(new FileReader(new File("chr1.fa")));
long t0= System.currentTimeMillis();
int c;
while( (c = fa.read()) != -1 ){
//
}
long t1= System.currentTimeMillis();
System.err.println(t1-t0); // ~ 7000 ms
}
Метод readLine()
занимает всего ~ 700 мс:
@Test
public void testReadLine() throws IOException{
BufferedReader fa= new BufferedReader(new FileReader(new File("chr1.fa")));
String line;
long t0= System.currentTimeMillis();
while( (line = fa.readLine()) != null ){
//
}
long t1= System.currentTimeMillis();
System.err.println(t1-t0); // ~ 700 ms
}
* Практическое назначение. Мне нужно знать длину каждой строки, включая символы новой строки (\n
или \r\n
) и длину строки после ее удаления. Мне также нужно знать, начинается ли строка с символа >
. Для данного файла это делается только один раз в начале программы. Поскольку символы EOL не возвращаются BufferedReader.readLine()
, я использую метод read()
. Если есть лучшие способы сделать это, скажите, пожалуйста.
** Файл с gzipped находится здесь http://hgdownload.cse.ucsc.edu/goldenpath/hg19/chromosomes/chr1.fa.gz. Для тех, кому может быть интересно, я пишу класс для индексации файлов fasta.