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

StackOverflow https://stackoverflow.com/questions/2242782

Вопрос

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

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

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

Конец

Это было полезно?

Решение

Лучше использовать BufferedReader с помощью FileReader

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top