Размер текстового файла Java (до закрытия файла)

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

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

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

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

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

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

7 ответов

Решение

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

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

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

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

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

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

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

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

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

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());

    }

}

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

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

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

Другие вопросы по тегам