10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/* 20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2013 The Guava Authors 30888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * you may not use this file except in compliance with the License. 60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * You may obtain a copy of the License at 70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 90888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software 110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * See the License for the specific language governing permissions and 140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License. 150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.io; 180888a09821a98ac0680fad765217302858e70fa4Paul Duffin 190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase; 200888a09821a98ac0680fad765217302858e70fa4Paul Duffin 210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.io.IOException; 220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.nio.CharBuffer; 230888a09821a98ac0680fad765217302858e70fa4Paul Duffin 240888a09821a98ac0680fad765217302858e70fa4Paul Duffin/** 250888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Tests for {@link CharSequenceReader}. 260888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 270888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Colin Decker 280888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 290888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic class CharSequenceReaderTest extends TestCase { 300888a09821a98ac0680fad765217302858e70fa4Paul Duffin 310888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testReadEmptyString() throws IOException { 320888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertReadsCorrectly(""); 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 340888a09821a98ac0680fad765217302858e70fa4Paul Duffin 350888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testReadsStringsCorrectly() throws IOException { 360888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertReadsCorrectly("abc"); 370888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertReadsCorrectly("abcde"); 380888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertReadsCorrectly("abcdefghijkl"); 390888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertReadsCorrectly("" 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin + "abcdefghijklmnopqrstuvwxyz\n" 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin + "ABCDEFGHIJKLMNOPQRSTUVWXYZ\r" 420888a09821a98ac0680fad765217302858e70fa4Paul Duffin + "0123456789\r\n" 430888a09821a98ac0680fad765217302858e70fa4Paul Duffin + "!@#$%^&*()-=_+\t[]{};':\",./<>?\\| "); 440888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin 460888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testMarkAndReset() throws IOException { 470888a09821a98ac0680fad765217302858e70fa4Paul Duffin String string = "abcdefghijklmnopqrstuvwxyz"; 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin CharSequenceReader reader = new CharSequenceReader(string); 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertTrue(reader.markSupported()); 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(string, readFully(reader)); 520888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFullyRead(reader); 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin // reset and read again 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.reset(); 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(string, readFully(reader)); 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFullyRead(reader); 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin // reset, skip, mark, then read the rest 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.reset(); 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(5, reader.skip(5)); 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.mark(Integer.MAX_VALUE); 630888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(string.substring(5), readFully(reader)); 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFullyRead(reader); 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin // reset to the mark and then read the rest 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.reset(); 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(string.substring(5), readFully(reader)); 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFullyRead(reader); 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 710888a09821a98ac0680fad765217302858e70fa4Paul Duffin 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testIllegalArguments() throws IOException { 730888a09821a98ac0680fad765217302858e70fa4Paul Duffin CharSequenceReader reader = new CharSequenceReader("12345"); 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin char[] buf = new char[10]; 760888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.read(buf, 0, 11); 780888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IndexOutOfBoundsException expected) { 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 830888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.read(buf, 10, 1); 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IndexOutOfBoundsException expected) { 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.read(buf, 11, 0); 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 910888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IndexOutOfBoundsException expected) { 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 950888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.read(buf, -1, 5); 960888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 970888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IndexOutOfBoundsException expected) { 980888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 990888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.read(buf, 5, -1); 1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IndexOutOfBoundsException expected) { 1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.read(buf, 0, 11); 1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IndexOutOfBoundsException expected) { 1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.skip(-1); 1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.mark(-1); 1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testMethodsThrowWhenClosed() throws IOException { 1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin CharSequenceReader reader = new CharSequenceReader(""); 1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.close(); 1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.read(); 1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IOException expected) { 1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.read(new char[10]); 1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IOException expected) { 1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.read(new char[10], 0, 10); 1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IOException expected) { 1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.read(CharBuffer.allocate(10)); 1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IOException expected) { 1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.skip(10); 1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IOException expected) { 1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.ready(); 1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IOException expected) { 1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1640888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1650888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1660888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.mark(10); 1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IOException expected) { 1690888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader.reset(); 1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IOException expected) { 1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1770888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1780888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Creates a CharSequenceReader wrapping the given CharSequence and tests that the reader produces 1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin * the same sequence when read using each type of read method it provides. 1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static void assertReadsCorrectly(CharSequence charSequence) throws IOException { 1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin String expected = charSequence.toString(); 1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin // read char by char 1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin CharSequenceReader reader = new CharSequenceReader(charSequence); 1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (int i = 0; i < expected.length(); i++) { 1880888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expected.charAt(i), reader.read()); 1890888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1900888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFullyRead(reader); 1910888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1920888a09821a98ac0680fad765217302858e70fa4Paul Duffin // read all to one array 1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader = new CharSequenceReader(charSequence); 1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin char[] buf = new char[expected.length()]; 1950888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expected.length() == 0 ? -1 : expected.length(), reader.read(buf)); 1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expected, new String(buf)); 1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFullyRead(reader); 1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin // read in chunks to fixed array 2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader = new CharSequenceReader(charSequence); 2010888a09821a98ac0680fad765217302858e70fa4Paul Duffin buf = new char[5]; 2020888a09821a98ac0680fad765217302858e70fa4Paul Duffin StringBuilder builder = new StringBuilder(); 2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin int read; 2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin while ((read = reader.read(buf, 0, buf.length)) != -1) { 2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin builder.append(buf, 0, read); 2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2070888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expected, builder.toString()); 2080888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFullyRead(reader); 2090888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2100888a09821a98ac0680fad765217302858e70fa4Paul Duffin // read all to one CharBuffer 2110888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader = new CharSequenceReader(charSequence); 2120888a09821a98ac0680fad765217302858e70fa4Paul Duffin CharBuffer buf2 = CharBuffer.allocate(expected.length()); 2130888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expected.length() == 0 ? -1 : expected.length(), reader.read(buf2)); 2140888a09821a98ac0680fad765217302858e70fa4Paul Duffin buf2.flip(); 2150888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expected, buf2.toString()); 2160888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFullyRead(reader); 2170888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2180888a09821a98ac0680fad765217302858e70fa4Paul Duffin // read in chunks to fixed CharBuffer 2190888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader = new CharSequenceReader(charSequence); 2200888a09821a98ac0680fad765217302858e70fa4Paul Duffin buf2 = CharBuffer.allocate(5); 2210888a09821a98ac0680fad765217302858e70fa4Paul Duffin builder = new StringBuilder(); 2220888a09821a98ac0680fad765217302858e70fa4Paul Duffin while (reader.read(buf2) != -1) { 2230888a09821a98ac0680fad765217302858e70fa4Paul Duffin buf2.flip(); 2240888a09821a98ac0680fad765217302858e70fa4Paul Duffin builder.append(buf2); 2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin buf2.clear(); 2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2270888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expected, builder.toString()); 2280888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFullyRead(reader); 2290888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2300888a09821a98ac0680fad765217302858e70fa4Paul Duffin // skip fully 2310888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader = new CharSequenceReader(charSequence); 2320888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expected.length(), reader.skip(Long.MAX_VALUE)); 2330888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFullyRead(reader); 2340888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2350888a09821a98ac0680fad765217302858e70fa4Paul Duffin // skip 5 and read the rest 2360888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (expected.length() > 5) { 2370888a09821a98ac0680fad765217302858e70fa4Paul Duffin reader = new CharSequenceReader(charSequence); 2380888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(5, reader.skip(5)); 2390888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2400888a09821a98ac0680fad765217302858e70fa4Paul Duffin buf = new char[expected.length() - 5]; 2410888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(buf.length, reader.read(buf, 0, buf.length)); 2420888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(expected.substring(5), new String(buf)); 2430888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFullyRead(reader); 2440888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2450888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2460888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2470888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static void assertFullyRead(CharSequenceReader reader) throws IOException { 2480888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-1, reader.read()); 2490888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-1, reader.read(new char[10], 0, 10)); 2500888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-1, reader.read(CharBuffer.allocate(10))); 2510888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(0, reader.skip(10)); 2520888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2530888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2540888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static String readFully(CharSequenceReader reader) throws IOException { 2550888a09821a98ac0680fad765217302858e70fa4Paul Duffin StringBuilder builder = new StringBuilder(); 2560888a09821a98ac0680fad765217302858e70fa4Paul Duffin int read; 2570888a09821a98ac0680fad765217302858e70fa4Paul Duffin while ((read = reader.read()) != -1) { 2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin builder.append((char) read); 2590888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2600888a09821a98ac0680fad765217302858e70fa4Paul Duffin return builder.toString(); 2610888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2620888a09821a98ac0680fad765217302858e70fa4Paul Duffin} 263