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