2010-02-11 5 views
3

Я использую следующие основные функции, которые я скопировал из сети, чтобы прочитать текстовый файлКак заставить Java читать очень большие файлы с помощью сканера?

public void read() 
{ 
    File file = new File("/Users/MAK/Desktop/data.txt"); 
    System.out.println("Start"); 
    try 
    { 
     // 
     // Create a new Scanner object which will read the data from the 
     // file passed in. To check if there are more line to read from it 
     // we check by calling the scanner.hasNextLine() method. We then 
     // read line one by one till all line is read. 
     // 
     Scanner scanner = new Scanner(file); 
     int lineCount = 0; 
     if (scanner == null) 
     { 
      System.out.println("Null File"); 
     } 
     else 
     { 
      System.out.println(scanner.toString()); 
     } 
     while (scanner.hasNextLine()) 
     { 
      String line = scanner.nextLine(); 

      System.out.println("Line " + lineCount +" contain : " + line); 
      lineCount++; 
     } 
     System.out.println("End of Try Bluck"); 
    } 
    catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 
     System.out.println("Exception Bluck"); 
    } 
    System.out.println("End"); 
} 
} 

Это работает нормально со средним и малым размер файла (которые содержат от 10 до 20 тысяч строку данных) Однако он не работал с файлом, содержащим 500 тыс. строк. Я не получаю ошибку (по крайней мере, не вижу никого). так, что происходит? что я должен делать здесь, чтобы иметь возможность готовить такие большие файлы?

примечание: я уже увеличил кучу на 2 ГБ на тестовой машине, которая запускает Windows Server 2008 с 4 ГБ оперативной памяти. но это не помогло!

Пожалуйста, кто-нибудь может сказать мне, что мне следует делать здесь?


Обновление 01

Ниже выходного

Старт

java.util.Scanner [разделители = \ р {javaWhitespace} +] [позиция = 0 ] [match valid = false] [required input = false] [source closed = false] [skipped = false] [group separator = \,] [decimal separator =.] [положительный префикс =] [отрицательный префикс = \ Q- \ E] [положительный суффикс =] [отрицательный суффикс =] [NaN st кольцо = \ Q \ E] [бесконечность строка = \ Q∞ \ E]

Конец Попробуйте Bluck

Конец

ответ

5

Лучше идти на BufferedReader с FileReader

+1

Ты лучший! :) BufferedReader решил проблему! Спасибо! Спасибо! Спасибо! Спасибо! Спасибо! Спасибо! Спасибо! Спасибо! Спасибо! Спасибо! Спасибо! –

1

Если вы не получаете сообщение об ошибке, это вполне может просто долгое время. Активен ли диск? Что вы делаете с консольным выходом - оно остановлено? Вы говорите, что это «не сработало», но вы не сказали, как оно себя ведет. Что вы видите?

Память не должна быть проблемой, поскольку вы на самом деле ничего не делаете с линиями - просто подсчитываете их и записываете на консоль.

Одна из проблем в коде - вы проверяете ли scanner имеет нулевое значение, но оно не может возможно быть, потому что вы используете ссылку, возвращаемый вызовом конструктора. С какой ситуацией вы пытались справиться?

+0

Я думал, что это занимает много времени, но на выходе уже показывает результат последнего оператора печати, который означает, что она сделала работу. Этот класс должен быть частью моей программы, которая должна обрабатывать каждую строку, а затем помещать ее в новый файл. Любая идея, что делать? –

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