Какой самый эффективный способ написать большой текстовый файл на Java?

#java #file-io #out-of-memory #heap-memory

#java #file-io #нехватка памяти #куча-память

Вопрос:

Я пытаюсь записать файл с некоторым объемом данных, используя это:

 public static <T extends SomeClass> void writeFile(String buffer, Class<T> clazz, int fileNumber) {
    String fileType = ".txt";
    File file = new File(clazz.getName() fileNumber fileType);
    PrintWriter printWriter = null;


    try {
        FileWriter writer = new FileWriter(file);
        printWriter = new PrintWriter(writer);
        printWriter.print(buffer);//error occurs here
        printWriter.flush();
        printWriter.close();
        System.out.println("created file: " file.getName());


    } catch (IOException e) {
        e.printStackTrace();
    } finally{
        if(printWriter!=null){
            printWriter.flush();
            printWriter.close();
        }
    }
    System.out.println("Done!");
}
  

Строка буфера содержит -6 МБ данных, и когда я запускаю код, я получаю java.lang.OutOfMemoryError точно в буфер.

Комментарии:

1. Предоставили ли вы вашей виртуальной машине Java разумный объем памяти с помощью опции командной строки -Xmx?

2. Вы пробовали записывать буфер меньшими блоками вместо одного вызова?

3. Кстати, я считаю, что причина, по которой PrintWriter.write использует память, заключается в том, что он кодирует всю строку в массив байтов, а затем записывает это.

Ответ №1:

Как насчет замены printWriter.print(buffer); на:

 for (int i = 0; i < buffer.length; i  = 100) {
    int end = i   100;

    if (end >= buffer.length) {
        end = buffer.length;
    }

    printWriter.print(buffer.substring(i, end);
    printWriter.flush();
}
  

Комментарии:

1. Программисты в наши дни привыкли к тому, что у них так много памяти, что они никогда не думают о ее сохранении. Жизнь — это баланс.

2. @Thom: согласен с вами, но баланс означает правильное использование максимально возможного ресурса. 😉

3. Баланс означает правильное использование ресурсов.

Ответ №2:

Поскольку 6 МБ — это не так много «данных», я думаю, вам следует увеличить объем памяти виртуальной машины Java,

посмотрите здесь

http://confluence.atlassian.com/display/DOC/Fix Out of Memory Errors by Increasing Available Memory