简体   繁体   中英

Current file size when using GZIPOutputStream

I am writing compressed data to disk using GZIPOutputStream in an asynchronous manner

I want to know the size of data already written so I can close the file once it reaches a limit

ByteBuffer src;
//..
//data added to src here
//..
File theFile = new File("hello.gz");
FileOutputStream fos = new FileOutputStream(theFile);
GZIPOutputStream zs = new GZIPOutputStream(fos);
BufferedWriter zipwriter = new BufferedWriter(new OutputStreamWriter(zs, "UTF-8"));

(while_more_data)
{
   zipwriter.write(src.get());
   // check current file size here and close file if limit is reached
}

Wrap your FileOutputStream into another output stream that is able to count the number of bytes written, like CountingOutputStream provided by third party library Jakarta Commons IO , or CountingOutputStream from Guava .

The implementation could be something like:

ByteBuffer src;
//..
//data added to src here
//..
File theFile = new File("hello.gz");
try (FileOutputStream fos = new FileOutputStream(theFile);
     CountingOutputStream cos = new CountingOutputStream(fos);
     GZIPOutputStream zs = new GZIPOutputStream(cos);
     BufferedWriter zipwriter = new BufferedWriter(new OutputStreamWriter(zs, "UTF-8"))) {

    (while_more_data) {
        zipwriter.write(src.get());
        zipwriter.flush(); // make sure, data passes cos
        if (cos.getByteCount() >= limit) {
            // limit reached
        }
    }
}

Or if you don't wan't to pull in an entire library like Guava or Commons-IO , you can just extend the GZIPOutputStream and obtain the data from the associated Deflater like so:

public class MyGZIPOutputStream extends GZIPOutputStream {

  public GZIPOutputStream(OutputStream out) throws IOException {
      super(out);
  }

  public long getBytesRead() {
      return def.getBytesRead();
  }

  public long getBytesWritten() {
      return def.getBytesWritten();
  }

  public void setLevel(int level) {
      def.setLevel(level);
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM