Размер текстового файла Java (до закрытия файла) - PullRequest
4 голосов
/ 21 ноября 2011

Я собираю полный HTML из службы, которая предоставляет доступ к очень большой коллекции блогов и новостных сайтов.Я проверяю HTML в реальном времени, чтобы увидеть, содержит ли он некоторые ключевые слова.Если он содержит одно из ключевых слов, я записываю HTML-код в текстовый файл для его хранения.

Я хочу сделать это в течение недели.Поэтому я собираю большое количество данных.Тестирование программы в течение 3 минут дало текстовый файл размером 100 МБ.У меня есть 4 ТБ свободного места, и я не могу использовать больше, чем это.

Кроме того, я не хочу, чтобы текстовые файлы становились слишком большими, потому что я предполагаю, что они станут не открываемыми.

Я предлагаю открыть текстовый файл и записать в него HTML, часто проверяя его размер.Если он становится больше, скажем, 200 МБ, я закрываю текстовый файл и открываю другой.Мне также нужно вести постоянный журнал того, сколько места я использовал в общей сложности, чтобы я мог убедиться, что я не приблизился к 4 ТБ.

Вопрос, который у меня есть на данный момент, таков:Как проверить размер текстового файла до его закрытия (с помощью FileWriter.close ()).Есть ли функция для этого или я должен подсчитать количество символов, записанных в файл и использовать его для оценки размера файла?

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

Ответы [ 7 ]

5 голосов
/ 21 ноября 2011

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

[РЕДАКТИРОВАТЬ] Примечание. Правильный способ сохранения текста в файле:

new BufferedWriter( new OutputStreamWriter( new FileOutputStream( file ), encoding ) ) );

Кодировка важна; обычно это «UTF-8».

Эта цепочка дает вам два места, где вы можете внедрить свою обертку: Вы можете обернуть писатель, чтобы получить количество символов, или внутренний OutputStream, чтобы записать байты.

3 голосов
/ 21 ноября 2011

Я продолжение к ответу Аарона. Вы можете использовать CountingOutputStream : просто оберните свой FileOutputStream с помощью CountingOutputStream, и вы сможете узнать, сколько байтов вы уже написали.

3 голосов
/ 21 ноября 2011

HTML легко сжимается с высокой степенью сжатия. Подумайте об использовании GZIPOutputStream , чтобы "минимизировать количество места", которое занимают ваши текстовые файлы.

3 голосов
/ 21 ноября 2011

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

2 голосов
/ 21 ноября 2011

Вам приходилось считать, сколько байтов вы записываете в файл?

1 голос
/ 21 ноября 2011
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;


public class TestFileWriter {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        FileWriter fileWriter= new FileWriter("test.txt");
        for (int i=0; i<1000; i++) {
            fileWriter.write("a very long string, a very long string, a very long string, a very long string, a very long string\n");
            if ((i%100)==0) {
                File file=new File("test.txt");
                System.out.println("file size=" +  file.length());
            }
        }
        fileWriter.close();
        File file=new File("test.txt");
        System.out.println("file size=" +  file.length());

    }

}

Этот пример демонстрирует, что если вы используете средство записи файлов, вы можете получить его размер в реальном времени во время записи и с открытым средством записи. Если вы хотите сэкономить место, вы можете заархивировать поток.

0 голосов
/ 21 ноября 2011

Извиняюсь за то, что немного не по теме:

Должно ли это быть в Java?В зависимости от того, как вы получаете данные фида, это звучит как работа для довольно простого сценария оболочки для меня (grep или fgrep для проверки ключевых слов, gzip для сжатия ...)

...