/* * handles reading off of the input stream * */ //2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678| package com.limegroup.gnutella; import java.io.IOException; import java.io.InputStream; /** * Provides the readLine method of a BufferedReader with no no automatic * buffering. All methods are like those in InputStream except they return * -1 instead of throwing IOException. * * This also catches ArrayIndexOutOfBoundsExceptions while reading, as this * exception can be thrown from native socket code on windows occasionally. * The exception is treated exactly like an IOException. */ public class ByteReader { private static final byte R = '\r'; private static final byte N = '\n'; private InputStream _istream; public ByteReader(InputStream stream) { _istream = stream; } public void close() { try { _istream.close(); } catch (IOException ignored) { } } public int read() { int c = -1; if (_istream == null) return c; try { c = _istream.read(); } catch(IOException ignored) { // return -1 } catch(ArrayIndexOutOfBoundsException ignored) { // return -1 } return c; } public int read(byte[] buf) { int c = -1; if (_istream == null) { return c; } try { c = _istream.read(buf); } catch(IOException ignored) { // return -1 } catch(ArrayIndexOutOfBoundsException ignored) { // return -1 } return c; } public int read(byte[] buf, int offset, int length) { int c = -1; if (_istream == null) { return c; } try { c = _istream.read(buf, offset, length); } catch(IOException ignored) { // return -1 } catch(ArrayIndexOutOfBoundsException ignored) { // happens on windows machines occasionally. // return -1 } return c; } /** * Reads a new line WITHOUT end of line characters. A line is * defined as a minimal sequence of character ending with "\n", with * all "\r"'s thrown away. Hence calling readLine on a stream * containing "abc\r\n" or "a\rbc\n" will return "abc". * * Throws IOException if there is an IO error. Returns null if * there are no more lines to read, i.e., EOF has been reached. * Note that calling readLine on "ab<EOF>" returns null. */ public String readLine() throws IOException { if (_istream == null) return ""; StringBuffer sBuffer = new StringBuffer(); int c = -1; //the character just read boolean keepReading = true; do { try { c = _istream.read(); } catch(ArrayIndexOutOfBoundsException aiooe) { // this is apparently thrown under strange circumstances. // interpret as an IOException. throw new IOException("aiooe."); } switch(c) { // if this was a \n character, break out of the reading loop case N: keepReading = false; break; // if this was a \r character, ignore it. case R: continue; // if we reached an EOF ... case -1: return null; // if it was any other character, append it to the buffer. default: sBuffer.append((char)c); } } while(keepReading); // return the string we have read. return sBuffer.toString(); } }