Как заставить 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[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][источник закрыт=false][skiped=false][разделитель групп=\,] [десятичный разделитель=.][положительный префикс=][отрицательный префикс=\Q-\E][положительный суффикс=][отрицательный суффикс=][строка NaN=\Q�\E][бесконечная строка=\Q∞\E ]

Конец попытки Блэк

Конец


person M. A. Kishawy    schedule 11.02.2010    source источник


Ответы (2)


Лучше пойти на BufferedReader с FileReader

person Abhiram    schedule 11.02.2010
comment
Ты лучший! :) BufferedReader решил проблему! Благодарю вас! Благодарю вас! Благодарю вас! Благодарю вас! Благодарю вас! Благодарю вас! Благодарю вас! Благодарю вас! Благодарю вас! Благодарю вас! Благодарю вас! - person M. A. Kishawy; 11.02.2010

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

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

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

person Jon Skeet    schedule 11.02.2010
comment
Я думал, что это займет много времени, но вывод уже показывает результат последнего оператора печати, что означает, что он работает. Этот класс должен быть частью моей программы, которая должна обрабатывать каждую строку, а затем помещать ее в новый файл. Любая идея, что делать? - person M. A. Kishawy; 11.02.2010