2017-02-20 53 views
3

У меня есть .txt с 1 миллиардом цифр пи. Я читаю в файле как String, но я получаю OutOfMemoryError. Он работал с 1 номером MIllion tho. Я сохраняю String как массив char []. Возможно ли каким-то образом передать TXT, когда я прохожу через весь массив? Мне просто нужен способ получить доступ ко всем 1 миллиардам цифр в виде массива.Чтение огромных текстовых файлов Java

+3

Какую обработку необходимо обрабатывать с данными чтения? – Berger

+0

Я езжу на велосипеде по всему массиву символов, чтобы найти определенное число ... так что просто цикл for через массив. Thats it – Steakie

+0

Что вы подразумеваете под "искать определенное число"? Число равно pi. Вы имеете в виду «искать определенную последовательность цифр»? Если да, сколько цифр? –

ответ

4

Существует BufferedInputStream Поскольку Java 1 или FileReader с

public int read(char cbuf[], int offset, int length) throws IOException 

Я предлагаю вам начать оттуда

+0

Это, вероятно, решение моей проблемы. возникли проблемы с реализацией .... Я продолжаю пытаться – Steakie

+0

Хорошо, понял это, thx много :) – Steakie

+0

Где релевантность 'BufferedInputStream' здесь? – Holger

0

Это не только возможно: это и настоятельно рекомендуется и делается на практике. Обычно выполняется повторное использование таких же интерфейсов, как библиотеки Java (InputStream и т. Д.).

В этом случае это может означать новый класс IntegerInputStream, который выводит цифры в виде потока. Этот класс может сам переадресовывать вызовы на FileInputStream. Внутри вы можете использовать массивы char [] для хранения буфера и повышения производительности, или вызовы, направленные через BufferedInputStream, как предлагает Павел, но лучше всего изолировать потребителя от внутреннего управления буфером и сохранить соответствующий уровень абстракции для использования случай (десятичные числа pi).

0

Вы можете открыть файл с помощью FileInputStream и прочитать его byte [] за байт [], чтобы избежать OOMError.

0

Согласно документу

Вы должны быть в состоянии получить строку длины 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(); 
+0

Почему вы читаете до 1000000 одиночных символов вместо вызова только 'read (char [])' на читателя ? Затем вам не нужно «BufferedReader» для работы с чрезмерными 'read()' invocations ... – Holger

+0

@Holger Я предполагаю, что это другой способ сделать это. С точки зрения сложности оба решения должны быть примерно одинаковыми.но да, я согласен, что одно лайнерное решение лучше – nafas

 Смежные вопросы

  • Нет связанных вопросов^_^