我正在以异步方式使用GZIPOutputStream将压缩数据写入磁盘。
我想知道已经写入的数据的大小,这样我就可以在文件达到极限时关闭它。
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
}发布于 2014-07-30 11:08:51
将您的FileOutputStream封装到另一个输出流中,它能够计算写入的字节数,比如第三方库雅加达公域IO提供的CountingOutputStream,或者番石榴中的CountingOutputStream。
实现可以类似于:
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
}
}
}发布于 2017-09-08 05:21:22
或如果您不想进入整个库,如番石榴或公-IO,则只需扩展GZIPOutputStream并从关联的平移器获取数据,如下所示:
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);
}
}https://stackoverflow.com/questions/25034996
复制相似问题