001: /*
002: * Copyright (C) 2003-2007 Stephen Ostermiller
003: * http://ostermiller.org/contact.pl?regarding=Java+Utilities
004: *
005: * This program is free software; you can redistribute it and/or modify
006: * it under the terms of the GNU General Public License as published by
007: * the Free Software Foundation; either version 2 of the License, or
008: * (at your option) any later version.
009: *
010: * This program is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013: * GNU General Public License for more details.
014: *
015: * See COPYING.TXT for details.
016: */
017: package com.Ostermiller.util;
018:
019: import java.io.*;
020:
021: /**
022: * An input stream with a close method with no effect.
023: * More information about this class is available from <a target="_top" href=
024: * "http://ostermiller.org/utils/NoCloseStream.html">ostermiller.org</a>.
025: * <p>
026: * This class is designed to wrap a normal input stream
027: * so that it can be passed to methods that read from it
028: * and may erroneously close it. This class is a workaround
029: * when the method cannot be modified because it is in a
030: * library.
031: *
032: * @author Stephen Ostermiller http://ostermiller.org/contact.pl?regarding=Java+Utilities
033: * @since ostermillerutils 1.01.00
034: */
035: public class NoCloseInputStream extends InputStream implements
036: NoCloseStream {
037:
038: /**
039: * The input stream that is being protected.
040: * All methods should be forwarded to it,
041: * except for the close method, which should
042: * do nothing. The reallyClose method should
043: * actually close this stream.
044: *
045: * @since ostermillerutils 1.01.00
046: */
047: protected InputStream in;
048:
049: /**
050: * Protect a new input stream.
051: *
052: * @param in The input stream that is being protected.
053: *
054: * @since ostermillerutils 1.01.00
055: */
056: public NoCloseInputStream(InputStream in) {
057: this .in = in;
058: }
059:
060: /**
061: * {@inheritDoc}
062: */
063: @Override
064: public int read() throws IOException {
065: return in.read();
066: }
067:
068: /**
069: * {@inheritDoc}
070: */
071: @Override
072: public int read(byte[] b) throws IOException {
073: return in.read(b);
074: }
075:
076: /**
077: * {@inheritDoc}
078: */
079: @Override
080: public int read(byte[] b, int off, int len) throws IOException {
081: return in.read(b, off, len);
082: }
083:
084: /**
085: * {@inheritDoc}
086: */
087: @Override
088: public long skip(long n) throws IOException {
089: return in.skip(n);
090: }
091:
092: /**
093: * {@inheritDoc}
094: */
095: @Override
096: public int available() throws IOException {
097: return in.available();
098: }
099:
100: /**
101: * Has no effect.
102: *
103: * @see #reallyClose()
104: *
105: * @since ostermillerutils 1.01.00
106: */
107: @Override
108: public void close() throws IOException {
109: // Does nothing
110: }
111:
112: /**
113: * {@inheritDoc}
114: */
115: @Override
116: public void mark(int readlimit) {
117: in.mark(readlimit);
118: }
119:
120: /**
121: * {@inheritDoc}
122: */
123: @Override
124: public void reset() throws IOException {
125: in.reset();
126: }
127:
128: /**
129: * {@inheritDoc}
130: */
131: @Override
132: public boolean markSupported() {
133: return in.markSupported();
134: }
135:
136: /**
137: * {@inheritDoc}
138: */
139: public void reallyClose() throws IOException {
140: in.close();
141: }
142: }
|