CharStreams.java revision 0888a09821a98ac0680fad765217302858e70fa4
1bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
3bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor *
4bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Licensed under the Apache License, Version 2.0 (the "License");
5bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * you may not use this file except in compliance with the License.
6bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * You may obtain a copy of the License at
7bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor *
8bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * http://www.apache.org/licenses/LICENSE-2.0
9bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor *
10bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Unless required by applicable law or agreed to in writing, software
11bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * distributed under the License is distributed on an "AS IS" BASIS,
12bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * See the License for the specific language governing permissions and
14bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * limitations under the License.
15bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */
16bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
17bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorpackage com.google.common.io;
18bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.base.Preconditions.checkNotNull;
200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Preconditions.checkPositionIndexes;
217dd252788645e940eada959bdde927426e2531c9Paul Duffin
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta;
237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.base.Charsets;
240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.base.Function;
250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.Iterables;
26bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
27bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.Closeable;
28bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.EOFException;
29bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.IOException;
30bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.InputStream;
31bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.InputStreamReader;
32bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.OutputStream;
33bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.OutputStreamWriter;
34bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.Reader;
35bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.StringReader;
36bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.Writer;
37bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.nio.CharBuffer;
38bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.nio.charset.Charset;
39bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.ArrayList;
40bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.Arrays;
41bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.List;
42bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
43bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor/**
44bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Provides utility methods for working with character streams.
45bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor *
46bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>All method parameters must be non-null unless documented otherwise.
47bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor *
48bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>Some of the methods in this class take arguments with a generic type of
49bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * {@code Readable & Closeable}. A {@link java.io.Reader} implements both of
50bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * those interfaces. Similarly for {@code Appendable & Closeable} and
51bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * {@link java.io.Writer}.
52bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor *
53bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @author Chris Nokleberg
54bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @author Bin Zhu
557dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Colin Decker
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 1.0
57bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@Beta
59bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorpublic final class CharStreams {
60bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  private static final int BUF_SIZE = 0x800; // 2K chars (4K bytes)
61bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
62bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  private CharStreams() {}
63bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
64bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
65bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns a factory that will supply instances of {@link StringReader} that
66bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * read a string value.
67bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
68bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param value the string to read
69bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the factory
700888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link CharSource#wrap(CharSequence)} instead. This method
710888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     is scheduled for removal in Guava 18.0.
72bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
730888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
740888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static InputSupplier<StringReader> newReaderSupplier(
750888a09821a98ac0680fad765217302858e70fa4Paul Duffin      final String value) {
760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return asInputSupplier(CharSource.wrap(value));
777dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
787dd252788645e940eada959bdde927426e2531c9Paul Duffin
797dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
807dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns a {@link CharSource} that reads the given string value.
817dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
827dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
830888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link CharSource#wrap(CharSequence)} instead. This method
840888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     is scheduled to be removed in Guava 16.0.
857dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
860888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
877dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static CharSource asCharSource(String string) {
880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return CharSource.wrap(string);
89bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
90bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
91bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
92bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns a factory that will supply instances of {@link InputStreamReader},
93bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * using the given {@link InputStream} factory and character set.
94bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
95bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param in the factory that will be used to open input streams
967dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @param charset the charset used to decode the input stream; see {@link
977dd252788645e940eada959bdde927426e2531c9Paul Duffin   *     Charsets} for helpful predefined constants
98bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the factory
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link ByteSource#asCharSource(Charset)} instead. This
1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     method is scheduled for removal in Guava 18.0.
101bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
103bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static InputSupplier<InputStreamReader> newReaderSupplier(
104bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      final InputSupplier<? extends InputStream> in, final Charset charset) {
1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return asInputSupplier(
1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ByteStreams.asByteSource(in).asCharSource(charset));
107bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
108bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
109bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
110bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns a factory that will supply instances of {@link OutputStreamWriter},
111bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * using the given {@link OutputStream} factory and character set.
112bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
113bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param out the factory that will be used to open output streams
1147dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @param charset the charset used to encode the output stream; see {@link
1157dd252788645e940eada959bdde927426e2531c9Paul Duffin   *     Charsets} for helpful predefined constants
116bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the factory
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link ByteSink#asCharSink(Charset)} instead. This method
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     is scheduled for removal in Guava 18.0.
119bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
121bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static OutputSupplier<OutputStreamWriter> newWriterSupplier(
122bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      final OutputSupplier<? extends OutputStream> out, final Charset charset) {
1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return asOutputSupplier(
1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ByteStreams.asByteSink(out).asCharSink(charset));
125bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
126bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
127bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
128bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Writes a character sequence (such as a string) to an appendable
129bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * object from the given supplier.
130bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
131bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param from the character sequence to write
132bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param to the output supplier
133bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link CharSink#write(CharSequence)} instead. This method
1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     is scheduled for removal in Guava 18.0.
136bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
138bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static <W extends Appendable & Closeable> void write(CharSequence from,
139bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      OutputSupplier<W> to) throws IOException {
1407dd252788645e940eada959bdde927426e2531c9Paul Duffin    asCharSink(to).write(from);
141bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
142bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
143bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
144bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Opens {@link Readable} and {@link Appendable} objects from the
145bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * given factories, copies all characters between the two, and closes
146bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * them.
147bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
148bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param from the input factory
149bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param to the output factory
150bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the number of characters copied
151bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link CharSource#copyTo(CharSink)} instead. This method is
1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     scheduled for removal in Guava 18.0.
154bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <R extends Readable & Closeable,
1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin      W extends Appendable & Closeable> long copy(InputSupplier<R> from,
1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      OutputSupplier<W> to) throws IOException {
1597dd252788645e940eada959bdde927426e2531c9Paul Duffin    return asCharSource(from).copyTo(asCharSink(to));
160bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
161bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
162bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
163bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Opens a {@link Readable} object from the supplier, copies all characters
164bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * to the {@link Appendable} object, and closes the input. Does not close
165bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * or flush the output.
166bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
167bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param from the input factory
168bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param to the object to write to
169bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the number of characters copied
170bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link CharSource#copyTo(Appendable)} instead. This method
1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     is scheduled for removal in Guava 18.0.
173bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <R extends Readable & Closeable> long copy(
1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin      InputSupplier<R> from, Appendable to) throws IOException {
1777dd252788645e940eada959bdde927426e2531c9Paul Duffin    return asCharSource(from).copyTo(to);
178bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
179bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
180bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
181bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Copies all characters between the {@link Readable} and {@link Appendable}
182bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * objects. Does not close or flush either object.
183bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
184bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param from the object to read from
185bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param to the object to write to
186bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the number of characters copied
187bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
188bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
189bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static long copy(Readable from, Appendable to) throws IOException {
1907dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(from);
1917dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(to);
192bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    CharBuffer buf = CharBuffer.allocate(BUF_SIZE);
193bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    long total = 0;
1947dd252788645e940eada959bdde927426e2531c9Paul Duffin    while (from.read(buf) != -1) {
195bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      buf.flip();
1967dd252788645e940eada959bdde927426e2531c9Paul Duffin      to.append(buf);
1977dd252788645e940eada959bdde927426e2531c9Paul Duffin      total += buf.remaining();
1987dd252788645e940eada959bdde927426e2531c9Paul Duffin      buf.clear();
199bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
200bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return total;
201bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
202bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
203bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
204bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Reads all characters from a {@link Readable} object into a {@link String}.
205bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Does not close the {@code Readable}.
206bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
207bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param r the object to read from
208bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return a string containing all the characters
209bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
210bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
211bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static String toString(Readable r) throws IOException {
212bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return toStringBuilder(r).toString();
213bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
214bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
215bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
216bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns the characters from a {@link Readable} & {@link Closeable} object
217bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * supplied by a factory as a {@link String}.
218bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
219bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param supplier the factory to read from
220bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return a string containing all the characters
221bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
2220888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link CharSource#read()} instead. This method is
2230888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     scheduled for removal in Guava 18.0.
224bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <R extends Readable & Closeable> String toString(
2270888a09821a98ac0680fad765217302858e70fa4Paul Duffin      InputSupplier<R> supplier) throws IOException {
2287dd252788645e940eada959bdde927426e2531c9Paul Duffin    return asCharSource(supplier).read();
229bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
230bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
231bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
232bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Reads all characters from a {@link Readable} object into a new
233bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {@link StringBuilder} instance. Does not close the {@code Readable}.
234bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
235bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param r the object to read from
236bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return a {@link StringBuilder} containing all the characters
237bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
238bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
239bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  private static StringBuilder toStringBuilder(Readable r) throws IOException {
240bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    StringBuilder sb = new StringBuilder();
241bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    copy(r, sb);
242bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return sb;
243bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
244bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
245bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
246bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Reads the first line from a {@link Readable} & {@link Closeable} object
247bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * supplied by a factory. The line does not include line-termination
248bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * characters, but does include other leading and trailing whitespace.
249bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
250bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param supplier the factory to read from
251bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the first line, or null if the reader is empty
252bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
2530888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link CharSource#readFirstLine()} instead. This method is
2540888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     scheduled for removal in Guava 18.0.
255bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
2560888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
2570888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <R extends Readable & Closeable> String readFirstLine(
2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      InputSupplier<R> supplier) throws IOException {
2597dd252788645e940eada959bdde927426e2531c9Paul Duffin    return asCharSource(supplier).readFirstLine();
260bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
261bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
262bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
263bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Reads all of the lines from a {@link Readable} & {@link Closeable} object
264bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * supplied by a factory. The lines do not include line-termination
265bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * characters, but do include other leading and trailing whitespace.
266bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
267bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param supplier the factory to read from
268bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return a mutable {@link List} containing all the lines
269bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
2700888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link CharSource#readLines()} instead, but note that it
2710888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     returns an {@code ImmutableList}. This method is scheduled for removal
2720888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     in Guava 18.0.
273bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
2740888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
2750888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <R extends Readable & Closeable> List<String> readLines(
2760888a09821a98ac0680fad765217302858e70fa4Paul Duffin      InputSupplier<R> supplier) throws IOException {
2777dd252788645e940eada959bdde927426e2531c9Paul Duffin    Closer closer = Closer.create();
278bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    try {
2797dd252788645e940eada959bdde927426e2531c9Paul Duffin      R r = closer.register(supplier.getInput());
2807dd252788645e940eada959bdde927426e2531c9Paul Duffin      return readLines(r);
2817dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (Throwable e) {
2827dd252788645e940eada959bdde927426e2531c9Paul Duffin      throw closer.rethrow(e);
283bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    } finally {
2847dd252788645e940eada959bdde927426e2531c9Paul Duffin      closer.close();
285bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
286bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
287bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
288bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
289bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Reads all of the lines from a {@link Readable} object. The lines do
290bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * not include line-termination characters, but do include other
291bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * leading and trailing whitespace.
292bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
293bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * <p>Does not close the {@code Readable}. If reading files or resources you
294bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * should use the {@link Files#readLines} and {@link Resources#readLines}
295bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * methods.
296bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
297bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param r the object to read from
298bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return a mutable {@link List} containing all the lines
299bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
300bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
301bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static List<String> readLines(Readable r) throws IOException {
302bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    List<String> result = new ArrayList<String>();
303bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    LineReader lineReader = new LineReader(r);
304bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    String line;
305bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    while ((line = lineReader.readLine()) != null) {
306bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      result.add(line);
307bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
308bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return result;
309bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
310bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
311bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
3127dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Streams lines from a {@link Readable} object, stopping when the processor
3137dd252788645e940eada959bdde927426e2531c9Paul Duffin   * returns {@code false} or all lines have been read and returning the result
3147dd252788645e940eada959bdde927426e2531c9Paul Duffin   * produced by the processor. Does not close {@code readable}. Note that this
3157dd252788645e940eada959bdde927426e2531c9Paul Duffin   * method may not fully consume the contents of {@code readable} if the
3167dd252788645e940eada959bdde927426e2531c9Paul Duffin   * processor stops processing early.
3177dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
3187dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @throws IOException if an I/O error occurs
3197dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
3207dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
3210888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <T> T readLines(
3220888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Readable readable, LineProcessor<T> processor) throws IOException {
3237dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(readable);
3247dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(processor);
3257dd252788645e940eada959bdde927426e2531c9Paul Duffin
3267dd252788645e940eada959bdde927426e2531c9Paul Duffin    LineReader lineReader = new LineReader(readable);
3277dd252788645e940eada959bdde927426e2531c9Paul Duffin    String line;
3287dd252788645e940eada959bdde927426e2531c9Paul Duffin    while ((line = lineReader.readLine()) != null) {
3297dd252788645e940eada959bdde927426e2531c9Paul Duffin      if (!processor.processLine(line)) {
3307dd252788645e940eada959bdde927426e2531c9Paul Duffin        break;
3317dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
3327dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3337dd252788645e940eada959bdde927426e2531c9Paul Duffin    return processor.getResult();
3347dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
3357dd252788645e940eada959bdde927426e2531c9Paul Duffin
3367dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
337bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Streams lines from a {@link Readable} and {@link Closeable} object
338bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * supplied by a factory, stopping when our callback returns false, or we
339bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * have read all of the lines.
340bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
341bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param supplier the factory to read from
342bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param callback the LineProcessor to use to handle the lines
343bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return the output of processing the lines
344bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
3450888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link CharSource#readLines(LineProcessor)} instead. This
3460888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     method is scheduled for removal in Guava 18.0.
347bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
3480888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
3490888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <R extends Readable & Closeable, T> T readLines(
3500888a09821a98ac0680fad765217302858e70fa4Paul Duffin      InputSupplier<R> supplier, LineProcessor<T> callback) throws IOException {
3517dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(supplier);
3527dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(callback);
3537dd252788645e940eada959bdde927426e2531c9Paul Duffin
3547dd252788645e940eada959bdde927426e2531c9Paul Duffin    Closer closer = Closer.create();
355bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    try {
3567dd252788645e940eada959bdde927426e2531c9Paul Duffin      R r = closer.register(supplier.getInput());
3577dd252788645e940eada959bdde927426e2531c9Paul Duffin      return readLines(r, callback);
3587dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (Throwable e) {
3597dd252788645e940eada959bdde927426e2531c9Paul Duffin      throw closer.rethrow(e);
360bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    } finally {
3617dd252788645e940eada959bdde927426e2531c9Paul Duffin      closer.close();
362bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
363bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
364bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
365bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
366bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Joins multiple {@link Reader} suppliers into a single supplier.
367bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Reader returned from the supplier will contain the concatenated data
368bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * from the readers of the underlying suppliers.
369bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
370bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * <p>Reading from the joined reader will throw a {@link NullPointerException}
371bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * if any of the suppliers are null or return null.
372bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
373bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * <p>Only one underlying reader will be open at a time. Closing the
374bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * joined reader will close the open underlying reader.
375bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
376bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param suppliers the suppliers to concatenate
377bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return a supplier that will return a reader containing the concatenated
378bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     data
3790888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link CharSource#concat(Iterable)} instead. This method
3800888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     is scheduled for removal in Guava 18.0.
381bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
3820888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
383bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static InputSupplier<Reader> join(
384bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      final Iterable<? extends InputSupplier<? extends Reader>> suppliers) {
3857dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(suppliers);
3860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Iterable<CharSource> sources = Iterables.transform(suppliers,
3870888a09821a98ac0680fad765217302858e70fa4Paul Duffin        new Function<InputSupplier<? extends Reader>, CharSource>() {
3880888a09821a98ac0680fad765217302858e70fa4Paul Duffin          @Override
3890888a09821a98ac0680fad765217302858e70fa4Paul Duffin          public CharSource apply(InputSupplier<? extends Reader> input) {
3900888a09821a98ac0680fad765217302858e70fa4Paul Duffin            return asCharSource(input);
3910888a09821a98ac0680fad765217302858e70fa4Paul Duffin          }
3920888a09821a98ac0680fad765217302858e70fa4Paul Duffin        });
3930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return asInputSupplier(CharSource.concat(sources));
394bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
395bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
3960888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
3970888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Varargs form of {@link #join(Iterable)}.
3980888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
3990888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Use {@link CharSource#concat(CharSource[])} instead. This
4000888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     method is scheduled for removal in Guava 18.0.
4010888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
4020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
4030888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @SuppressWarnings("unchecked") // suppress "possible heap pollution" warning in JDK7
4040888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static InputSupplier<Reader> join(
4050888a09821a98ac0680fad765217302858e70fa4Paul Duffin      InputSupplier<? extends Reader>... suppliers) {
406bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return join(Arrays.asList(suppliers));
407bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
408bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
409bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
410bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Discards {@code n} characters of data from the reader. This method
411bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * will block until the full amount has been skipped. Does not close the
412bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * reader.
413bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
414bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param reader the reader to read from
415bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param n the number of characters to skip
416bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws EOFException if this stream reaches the end before skipping all
4170888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     the characters
418bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws IOException if an I/O error occurs
419bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
420bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static void skipFully(Reader reader, long n) throws IOException {
4217dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(reader);
422bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    while (n > 0) {
423bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      long amt = reader.skip(n);
424bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      if (amt == 0) {
425bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        // force a blocking read
426bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        if (reader.read() == -1) {
427bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor          throw new EOFException();
428bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        }
429bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        n--;
430bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      } else {
431bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        n -= amt;
432bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      }
433bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
434bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
435bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
436bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
4370888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns a {@link Writer} that simply discards written chars.
4380888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
4390888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @since 15.0
4400888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
4410888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static Writer nullWriter() {
4420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return NullWriter.INSTANCE;
4430888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4440888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4450888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static final class NullWriter extends Writer {
4460888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private static final NullWriter INSTANCE = new NullWriter();
4480888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void write(int c) {
4510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4520888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4530888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void write(char[] cbuf) {
4550888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkNotNull(cbuf);
4560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4570888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void write(char[] cbuf, int off, int len) {
4600888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkPositionIndexes(off, off + len, cbuf.length);
4610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4620888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void write(String str) {
4650888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkNotNull(str);
4660888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4670888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void write(String str, int off, int len) {
4700888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkPositionIndexes(off, off + len, str.length());
4710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4720888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4740888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public Writer append(CharSequence csq) {
4750888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkNotNull(csq);
4760888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return this;
4770888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4780888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4790888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4800888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public Writer append(CharSequence csq, int start, int end) {
4810888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkPositionIndexes(start, end, csq.length());
4820888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return this;
4830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4840888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4850888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public Writer append(char c) {
4870888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return this;
4880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4890888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void flush() {
4920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4930888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void close() {
4960888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4970888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public String toString() {
5000888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return "CharStreams.nullWriter()";
5010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
5020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
5030888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5040888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
505bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns a Writer that sends all output to the given {@link Appendable}
506bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * target. Closing the writer will close the target if it is {@link
507bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Closeable}, and flushing the writer will flush the target if it is {@link
508bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * java.io.Flushable}.
509bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
510bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @param target the object to which output will be sent
511bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @return a new Writer object, unless target is a Writer, in which case the
512bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *     target is returned
513bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
514bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static Writer asWriter(Appendable target) {
515bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    if (target instanceof Writer) {
516bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor      return (Writer) target;
517bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    }
518bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return new AppendableWriter(target);
519bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
5207dd252788645e940eada959bdde927426e2531c9Paul Duffin
5217dd252788645e940eada959bdde927426e2531c9Paul Duffin  // TODO(user): Remove these once Input/OutputSupplier methods are removed
5227dd252788645e940eada959bdde927426e2531c9Paul Duffin
5230888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static Reader asReader(final Readable readable) {
5247dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(readable);
5257dd252788645e940eada959bdde927426e2531c9Paul Duffin    if (readable instanceof Reader) {
5267dd252788645e940eada959bdde927426e2531c9Paul Duffin      return (Reader) readable;
5277dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
5287dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new Reader() {
5297dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
5307dd252788645e940eada959bdde927426e2531c9Paul Duffin      public int read(char[] cbuf, int off, int len) throws IOException {
5317dd252788645e940eada959bdde927426e2531c9Paul Duffin        return read(CharBuffer.wrap(cbuf, off, len));
5327dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5337dd252788645e940eada959bdde927426e2531c9Paul Duffin
5347dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
5357dd252788645e940eada959bdde927426e2531c9Paul Duffin      public int read(CharBuffer target) throws IOException {
5367dd252788645e940eada959bdde927426e2531c9Paul Duffin        return readable.read(target);
5377dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5387dd252788645e940eada959bdde927426e2531c9Paul Duffin
5397dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
5407dd252788645e940eada959bdde927426e2531c9Paul Duffin      public void close() throws IOException {
5410888a09821a98ac0680fad765217302858e70fa4Paul Duffin        if (readable instanceof Closeable) {
5420888a09821a98ac0680fad765217302858e70fa4Paul Duffin          ((Closeable) readable).close();
5430888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
5447dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5457dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
5467dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5477dd252788645e940eada959bdde927426e2531c9Paul Duffin
5480888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
5490888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns a view of the given {@code Readable} supplier as a
5500888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@code CharSource}.
5510888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
5520888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>This method is a temporary method provided for easing migration from
5530888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * suppliers to sources and sinks.
5540888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
5550888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @since 15.0
5560888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Convert all {@code InputSupplier<? extends Readable>}
5570888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     implementations to extend {@link CharSource} or provide a method for
5580888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     viewing the object as a {@code CharSource}. This method is scheduled
5590888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     for removal in Guava 18.0.
5600888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
5610888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
5620888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static CharSource asCharSource(
5630888a09821a98ac0680fad765217302858e70fa4Paul Duffin      final InputSupplier<? extends Readable> supplier) {
5647dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(supplier);
5657dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new CharSource() {
5667dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
5677dd252788645e940eada959bdde927426e2531c9Paul Duffin      public Reader openStream() throws IOException {
5687dd252788645e940eada959bdde927426e2531c9Paul Duffin        return asReader(supplier.getInput());
5697dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5700888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5710888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
5720888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public String toString() {
5730888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return "CharStreams.asCharSource(" + supplier + ")";
5740888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
5757dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
5767dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5777dd252788645e940eada959bdde927426e2531c9Paul Duffin
5780888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
5790888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns a view of the given {@code Appendable} supplier as a
5800888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@code CharSink}.
5810888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
5820888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>This method is a temporary method provided for easing migration from
5830888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * suppliers to sources and sinks.
5840888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
5850888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @since 15.0
5860888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @deprecated Convert all {@code OutputSupplier<? extends Appendable>}
5870888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     implementations to extend {@link CharSink} or provide a method for
5880888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     viewing the object as a {@code CharSink}. This method is scheduled
5890888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *     for removal in Guava 18.0.
5900888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
5910888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Deprecated
5920888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static CharSink asCharSink(
5930888a09821a98ac0680fad765217302858e70fa4Paul Duffin      final OutputSupplier<? extends Appendable> supplier) {
5947dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(supplier);
5957dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new CharSink() {
5967dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
5977dd252788645e940eada959bdde927426e2531c9Paul Duffin      public Writer openStream() throws IOException {
5987dd252788645e940eada959bdde927426e2531c9Paul Duffin        return asWriter(supplier.getOutput());
5997dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
6000888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6010888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
6020888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public String toString() {
6030888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return "CharStreams.asCharSink(" + supplier + ")";
6040888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
6057dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
6067dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
6070888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6080888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @SuppressWarnings("unchecked") // used internally where known to be safe
6090888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <R extends Reader> InputSupplier<R> asInputSupplier(
6100888a09821a98ac0680fad765217302858e70fa4Paul Duffin      CharSource source) {
6110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return (InputSupplier) checkNotNull(source);
6120888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
6130888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6140888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @SuppressWarnings("unchecked") // used internally where known to be safe
6150888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <W extends Writer> OutputSupplier<W> asOutputSupplier(
6160888a09821a98ac0680fad765217302858e70fa4Paul Duffin      CharSink sink) {
6170888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return (OutputSupplier) checkNotNull(sink);
6180888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
619bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor}
620