#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()
не очищает свои выходные данные, возможно, чтобы гарантировать некоторый уровень сжатия или потому, что формат файла этого не допускает.