Размер текстового файла 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
для сжатия...)