Вот что я имею в виду, когда говорю «специализированный сканер».В зависимости от эффективности синтаксического анализатора (или разбиения), это может быть немного быстрее (вероятно, это не так):
BufferedReader br=new BufferedReader(...);
for(i=0;i<n;i++)
{
String str=br.readLine();
long[] resultLongs = {-1,-1,-1};
int startPos=0;
int nextLongIndex=0;
for (int p=0;p<str.length();p++)
{
if (str.charAt(p)== ' ')
{
String intAsStr=str.substring(startPos, p-1);
resultLongs[nextLongIndex++]=Integer.parseInt(intAsStr);
startpos=p+1;
}
}
// t1, t2 and z are in resultLongs[0] through resultLongs[2]
}
Hths.
И, конечно, это не помогает, если входной файл содержитмусор, т. е. все, кроме длинных, разделенных пробелами.
И, кроме того, чтобы свести к минимуму «обходы» ОС, неплохо бы снабдить буферизованный ридер нестандартным (больше стандартного)) буфер.
Уточнен другой совет, который я дал в комментарии: если вам нужно читать такой огромный текстовый файл более одного раза, то есть более одного раза после его обновления, вы можете прочитать все длинные вструктура данных (может быть список элементов, содержащих три длинных), и поток в файл «кеш».В следующий раз сравните метку времени текстового файла с файлом «кэша».Если он старше, прочитайте файл кеша.Поскольку потоковый ввод / вывод не сериализует long в свое строковое представление, вы увидите намного лучшее время чтения.
EDIT: пропущено переназначение startPos.РЕДАКТИРОВАТЬ 2: Добавлено объяснение идеи кеша.