Для экономии памяти не храните / не дублируйте данные в памяти (т.е. не назначайте их переменным вне цикла). Просто обработайте вывод немедленно , как только вход поступит.
Это действительно не имеет значения, используете ли вы BufferedReader
или нет. Это не будет стоить значительно больше памяти, как некоторые неявно предполагают. В лучшем случае это будет всего лишь несколько процентов от производительности. То же самое касается использования NIO. Это только улучшит масштабируемость, но не использование памяти. Это станет интересным только тогда, когда вы работаете с сотнями потоков в одном файле.
Просто циклически просматривайте файл, записывайте каждую строку сразу в другой файл по мере того, как вы читаете, подсчитывайте строки и, если он достигнет 100, затем переключитесь на следующий файл и так далее.
Пример запуска:
String encoding = "UTF-8";
int maxlines = 100;
BufferedReader reader = null;
BufferedWriter writer = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream("/bigfile.txt"), encoding));
int count = 0;
for (String line; (line = reader.readLine()) != null;) {
if (count++ % maxlines == 0) {
close(writer);
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/smallfile" + (count / maxlines) + ".txt"), encoding));
}
writer.write(line);
writer.newLine();
}
} finally {
close(writer);
close(reader);
}