ClosedWriter.java

  1. /*
  2.  * Licensed to the Apache Software Foundation (ASF) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * The ASF licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.apache.commons.io.output;

  18. import java.io.IOException;
  19. import java.io.Writer;

  20. /**
  21.  * Throws an IOException on all attempts to write with {@link #close()} implemented as a noop.
  22.  * <p>
  23.  * Typically uses of this class include testing for corner cases in methods that accept a writer and acting as a
  24.  * sentinel value instead of a {@code null} writer.
  25.  * </p>
  26.  *
  27.  * @since 2.7
  28.  */
  29. public class ClosedWriter extends Writer {

  30.     /**
  31.      * The singleton instance.
  32.      *
  33.      * @since 2.12.0
  34.      */
  35.     public static final ClosedWriter INSTANCE = new ClosedWriter();

  36.     /**
  37.      * The singleton instance.
  38.      *
  39.      * @deprecated Use {@link #INSTANCE}.
  40.      */
  41.     @Deprecated
  42.     public static final ClosedWriter CLOSED_WRITER = INSTANCE;

  43.     /**
  44.      * Construct a new instance.
  45.      */
  46.     public ClosedWriter() {
  47.         // empty
  48.     }

  49.     @Override
  50.     public void close() throws IOException {
  51.         // noop
  52.     }

  53.     /**
  54.      * Throws an {@link IOException} to indicate that the stream is closed.
  55.      *
  56.      * @throws IOException always thrown
  57.      */
  58.     @Override
  59.     public void flush() throws IOException {
  60.         throw new IOException("flush() failed: stream is closed");
  61.     }

  62.     /**
  63.      * Throws an {@link IOException} to indicate that the writer is closed.
  64.      *
  65.      * @param cbuf ignored
  66.      * @param off ignored
  67.      * @param len ignored
  68.      * @throws IOException always thrown
  69.      */
  70.     @Override
  71.     public void write(final char[] cbuf, final int off, final int len) throws IOException {
  72.         throw new IOException("write(" + new String(cbuf) + ", " + off + ", " + len + ") failed: stream is closed");
  73.     }
  74. }