У меня есть .txt с 1 миллиардом цифр пи. Я читаю в файле как String, но я получаю OutOfMemoryError. Он работал с 1 номером MIllion tho. Я сохраняю String как массив char []. Возможно ли каким-то образом передать TXT, когда я прохожу через весь массив? Мне просто нужен способ получить доступ ко всем 1 миллиардам цифр в виде массива.Чтение огромных текстовых файлов Java
ответ
Существует BufferedInputStream Поскольку Java 1 или FileReader с
public int read(char cbuf[], int offset, int length) throws IOException
Я предлагаю вам начать оттуда
Это не только возможно: это и настоятельно рекомендуется и делается на практике. Обычно выполняется повторное использование таких же интерфейсов, как библиотеки Java (InputStream и т. Д.).
В этом случае это может означать новый класс IntegerInputStream, который выводит цифры в виде потока. Этот класс может сам переадресовывать вызовы на FileInputStream
. Внутри вы можете использовать массивы char [] для хранения буфера и повышения производительности, или вызовы, направленные через BufferedInputStream
, как предлагает Павел, но лучше всего изолировать потребителя от внутреннего управления буфером и сохранить соответствующий уровень абстракции для использования случай (десятичные числа pi).
Вы можете открыть файл с помощью FileInputStream
и прочитать его byte [] за байт [], чтобы избежать OOMError.
Согласно документу
Вы должны быть в состоянии получить строку длины Integer.MAX_VALUE (всегда 2147483647 (231 - 1) по спецификации Java, максимальный размер массива, который класс Строка использую для внутреннего хранения) или половины вашего максимального размера кучи (поскольку каждый символ состоит из двух байт), в зависимости от того, меньше
Вот почему вы получите исключение,
, если вы на самом деле не нужны все 1B символов. вы можете попробовать использовать буфер, который не загружает все это в память.
BufferedReader br = new BufferedReader(new FileReader(new File("path to file")));
char[] data=new char[1000000] ;//however many chars you want;
int i=0;
while ((c = br.read()) != -1 && i<data.length) {
data[i++]= c;
}
br.close();
Почему вы читаете до 1000000 одиночных символов вместо вызова только 'read (char [])' на читателя ? Затем вам не нужно «BufferedReader» для работы с чрезмерными 'read()' invocations ... – Holger
@Holger Я предполагаю, что это другой способ сделать это. С точки зрения сложности оба решения должны быть примерно одинаковыми.но да, я согласен, что одно лайнерное решение лучше – nafas
Какую обработку необходимо обрабатывать с данными чтения? – Berger
Я езжу на велосипеде по всему массиву символов, чтобы найти определенное число ... так что просто цикл for через массив. Thats it – Steakie
Что вы подразумеваете под "искать определенное число"? Число равно pi. Вы имеете в виду «искать определенную последовательность цифр»? Если да, сколько цифр? –