java: продолжать отслеживать размер файла во время выполнения?

#java #io #size #compression #objectoutputstream

#java #io #размер #сжатие #objectoutputstream

Вопрос:

Я написал код, который записывает сжатые объекты в файл, мои вопросы таковы: есть ли способ, которым я мог бы отслеживать увеличение размера моего файла по мере записи объекта в? вот мой код:

 public static void storeCompressedObjs(File outFile, ArrayList<Object[]> obj) {
    FileOutputStream fos = null;
    GZIPOutputStream gz = null;
    ObjectOutputStream oos = null;
    try {
        fos = new FileOutputStream(outFile);
        gz = new GZIPOutputStream(fos);
        oos = new ObjectOutputStream(gz);
        for (Object str : obj) {
            oos.writeObject(str);
            oos.flush();
            //I was hoping to print outFile.length() here, but it doesn't work
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        oos.close();
        gz.close();
        fos.close();
    }
}
  

Я пытался использовать flush after every oos.writeObject(str); , а затем получить размер файла с помощью outFile.length() , но независимо от того, сколько я его очищаю, размер файла остается неизменным до последнего перехода к его окончательному размеру. В любом случае, что я мог бы это исправить? Спасибо

Ответ №1:

Проект Apache Commons предоставляет класс CountingOutputStream, который вы можете поместить в свою цепочку OutputStream файлов. У вас может быть даже два из них:

 package so5997784;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;

import org.apache.commons.io.output.CountingOutputStream;

public class CountBytes {

  private static void dump(File outFile, Object... objs) throws IOException {
    FileOutputStream fos = new FileOutputStream(outFile);
    try {
      CountingOutputStream compressedCounter = new CountingOutputStream(fos);
      OutputStream gz = new GZIPOutputStream(compressedCounter);
      CountingOutputStream uncompressedCounter = new CountingOutputStream(gz);
      ObjectOutputStream oos = new ObjectOutputStream(uncompressedCounter);

      for (Object obj : objs) {
        oos.writeObject(obj);
        oos.flush();
        System.out.println(uncompressedCounter.getByteCount()   " -> "   compressedCounter.getByteCount());
      }
      oos.close();
      System.out.println(uncompressedCounter.getByteCount()   " -> "   compressedCounter.getByteCount());

    } finally {
      fos.close();
    }
  }

  public static void main(String[] args) throws IOException {
    File outFile = new File("objects.out.gz");
    dump(outFile, "a", "b", "cde", "hello", "world");
  }

}
  

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

1. Когда я вызывал метод, я получил 8 -> 10 12 -> 10 18 -> 10 26 -> 10 34 -> 10 34 -> 51 Почему там 5-10 секунд, разве это не должно увеличиваться?

2. В любом случае, это достигает того, чего я хочу, большое спасибо за вашу помощь

3.Это связано с тем, что GZIPOutputStream.flush() не очищает свои выходные данные, возможно, чтобы гарантировать некоторый уровень сжатия или потому, что формат файла этого не допускает.