Как заставить Java читать очень большие файлы, используя Scanner? - PullRequest
3 голосов
/ 11 февраля 2010

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

    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] [нужен ввод = false] [источник закрыт = false] [пропущено = false] [разделитель группы = \,] [десятичный разделитель =.] [положительный префикс =] [отрицательный префикс = \ Q- \ E] [положительный суффикс =] [отрицательный суффикс =] [Строка NaN = \ Q \ E] [строка бесконечности = \ Q ∞ \ E]

Конец Try Bluck

Конец

Ответы [ 2 ]

5 голосов
/ 11 февраля 2010

Лучше пойти для BufferedReader с FileReader

1 голос
/ 11 февраля 2010

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

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

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

...