package jef.tools.zip; import java.io.File; import java.io.IOException; import java.io.OutputStream; import jef.tools.Assert; import jef.tools.IOUtils; import jef.tools.io.CountOutputStream; public abstract class SwitchAbleOutputStream extends CountOutputStream{ public SwitchAbleOutputStream(OutputStream out,long size) { super(out); this.volumnSize=size; this.leftSize=volumnSize; } private long volumnSize; //每卷的大小 private int index=0; //当前是第几卷 //当前卷剩余的大小 private long leftSize; public long getVolumnSize() { return volumnSize; } public void setVolumnSize(long volumnSize) { this.volumnSize = volumnSize; } public void switchNextVolumn() { Assert.isTrue(volumnSize>0); IOUtils.closeQuietly(out); index++; out=getNextVolOutputStream(index); super.count=0; this.leftSize=volumnSize; } public long getLeftSize() { return leftSize; } protected abstract OutputStream getNextVolOutputStream(int currentIndex); /** * 计算目前是否需要切换分卷 * @return */ public boolean needChangeVolumn() { if(volumnSize==0)return false; return count>=volumnSize; } @Override public void write(int b) throws IOException { super.write(b); leftSize--; } @Override public void write(byte[] b) throws IOException { this.write(b,0,b.length); } @Override public void write(byte[] b, int off, int len) throws IOException { if(volumnSize>0 && len>(int)leftSize){ int thisS=(int)leftSize; int nextS=(len-thisS); super.write(b, 0, thisS); if(needChangeVolumn()){ this.switchNextVolumn(); } super.write(b, thisS, nextS); leftSize-=nextS; }else{ super.write(b, off, len); leftSize-=len; } } @Override public void flush() throws IOException { super.flush(); } @Override public void close() throws IOException { super.close(); } public abstract File getFirstVolFile(); }