Mega Code Archive

 
Categories / Java / File Input Output
 

Writer that places all output on an {@link Appendable} target

/* Copyright (c) 2008 Google Inc.  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  *     http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ //package com.google.gdata.util.common.io; import java.io.Closeable; import java.io.Flushable; import java.io.Writer; import java.io.IOException; /**  * Writer that places all output on an {@link Appendable} target. If the target  * is {@link Flushable} or {@link Closeable}, flush()es and close()s will also  * be delegated to the target.  *  *   *   */ class AppendableWriter extends Writer {   private final Appendable target;   private boolean closed;   /**    * Creates a new writer that appends everything it writes to {@code target}.    *    * @param target target to which to append output    */   AppendableWriter(Appendable target) {     this.target = target;   }   /*    * Abstract methods from Writer    */   @Override public void write(char cbuf[], int off, int len)       throws IOException {     checkNotClosed();     // It turns out that creating a new String is usually as fast, or faster     // than wrapping cbuf in a light-weight CharSequence. See benchmark code     // in comments of http://cl/9327627 and results at     // https://spreadsheets.google.com/a/google.com/ccc?key=pABoWmCP48mrC_J8v4xh1ZA     target.append(new String(cbuf, off, len));   }   @Override public void flush() throws IOException {     checkNotClosed();     if (target instanceof Flushable) {       ((Flushable) target).flush();     }   }   @Override public void close() throws IOException {     this.closed = true;     if (target instanceof Closeable) {       ((Closeable) target).close();     }   }   /*    * Override a few functions for performance reasons to avoid creating    * unnecessary strings.    */   @Override public void write(int c) throws IOException {     checkNotClosed();     target.append((char) c);   }   @Override public void write(String str) throws IOException {     checkNotClosed();     target.append(str);   }   @Override public void write(String str, int off, int len) throws IOException {     checkNotClosed();     // tricky: append takes start, end pair...     target.append(str, off, off + len);   }   @Override public Writer append(char c) throws IOException {     checkNotClosed();     target.append(c);     return this;   }   @Override public Writer append(CharSequence charSeq) throws IOException {     checkNotClosed();     target.append(charSeq);     return this;   }   @Override public Writer append(CharSequence charSeq, int start, int end)       throws IOException {     checkNotClosed();     target.append(charSeq, start, end);     return this;   }   private void checkNotClosed() throws IOException {     if (closed) {       throw new IOException("Cannot write to a closed writer.");     }   } }