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 output 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 output stream
027: * so that it can be passed to methods that write to 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 NoCloseOutputStream extends OutputStream implements
036: NoCloseStream {
037:
038: /**
039: * The output 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 OutputStream out;
048:
049: /**
050: * Protect a new output stream.
051: *
052: * @param out The output stream that is being protected.
053: *
054: * @since ostermillerutils 1.01.00
055: */
056: public NoCloseOutputStream(OutputStream out) {
057: this .out = out;
058: }
059:
060: /**
061: * {@inheritDoc}
062: */
063: @Override
064: public void write(int b) throws IOException {
065: out.write(b);
066: }
067:
068: /**
069: * {@inheritDoc}
070: */
071: @Override
072: public void write(byte[] b) throws IOException {
073: out.write(b);
074: }
075:
076: /**
077: * {@inheritDoc}
078: */
079: @Override
080: public void write(byte[] b, int off, int len) throws IOException {
081: out.write(b, off, len);
082: }
083:
084: /**
085: * {@inheritDoc}
086: */
087: @Override
088: public void flush() throws IOException {
089: out.flush();
090: }
091:
092: /**
093: * Has no effect.
094: *
095: * @see #reallyClose()
096: *
097: * @since ostermillerutils 1.01.00
098: */
099: @Override
100: public void close() throws IOException {
101: // Does nothing
102: }
103:
104: /**
105: * {@inheritDoc}
106: */
107: public void reallyClose() throws IOException {
108: out.close();
109: }
110: }
|