001 package org.shiftone.jrat.util.io; 002 003 004 import org.shiftone.jrat.util.io.proxy.ProxyInputStream; 005 import org.shiftone.jrat.util.log.Logger; 006 007 import java.io.IOException; 008 import java.io.InputStream; 009 010 011 /** 012 * Class OpenInputStream wrapps/proxies to a real InputStream and prevents the 013 * caller from closing the underlying input stream. This is useful when reading 014 * chunks from a ZipInputStream passing the archive entry inputStreams to code 015 * that calls close(). This would typically close the entire ZipInputStream, 016 * which would prevent any other archive entries from being read. 017 * 018 * @author jeff@shiftone.org (Jeff Drost) 019 */ 020 public class OpenInputStream extends ProxyInputStream { 021 022 private static final Logger LOG = Logger.getLogger(OpenInputStream.class); 023 private InputStream inputStream = null; 024 025 public OpenInputStream(InputStream inputStream) { 026 this.inputStream = inputStream; 027 } 028 029 030 protected InputStream getTarget() throws IOException { 031 032 assertOpen(); 033 034 return inputStream; 035 } 036 037 038 public void assertOpen() throws IOException { 039 040 if (inputStream == null) { 041 throw new IOException("InputStream is closed"); 042 } 043 } 044 045 046 /** 047 * Method close does not call close() on the underlying input stream. It 048 * set's a flag that is used assertions in the read methods of this class. 049 */ 050 public void close() throws IOException { 051 052 assertOpen(); 053 054 inputStream = null; 055 056 // DO NOT inputStream.close(); 057 } 058 }