Чтение файла за символом и запись его в выходной файл может решить проблему. Поскольку он не загружает весь файл сразу.
Итак, процесс будет - читать входной файл за символом, продолжать до нужного начального индекса подстроки, затем начинать запись в выходной файл до конца подстроки.
Если вы получаете Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
, вы можете попробовать увеличить размер кучи, если вам действительно нужно прочитать файл сразу, и вы уверены, что размер строки не превысит ограничение максимального размера строки.
Следующий фрагмент демонстрирует идею выше -
import java.io.*;
public class LargeFileSubstr {
public static void main(String[] args) throws IOException {
BufferedReader r = new BufferedReader(new FileReader("/Users/me/Downloads/big.txt"));
try (PrintWriter wr = new PrintWriter(new FileWriter("/Users/me/Downloads/big_substr.txt"))) {
int startIndex = 100;
int endIndex = 200;
int pointer = 0;
int ch;
while ((ch = r.read()) != -1) {
if (pointer > endIndex) {
break;
}
if (pointer >= startIndex) {
wr.print((char) ch);
}
pointer++;
}
}
}
}
Я пытался извлечь 200 МБ подстроки из файла 2 ГБ, работает довольно быстро.