Mega Code Archive

 
Categories / Java / File Input Output
 

A line reading wrapper that works with byte streams

/*  * Copyright 2008-2009 SHOP.COM  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  *    http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ //package com.shop.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; /**  * A line reading wrapper that works with byte streams. Has the same sematics as  * {@link BufferedReader}<br>  *   * @author Jordan Zimmerman  */ public class LineReader extends InputStream {   public LineReader(InputStream in) {     fIn = in;     fBuffer = new StringBuilder();     fLastWasCR = false;     fPushbackChar = 0;   }   @Override   public synchronized int read() throws IOException {     if (fPushbackChar == 0) {       return streamRead();     } else {       return pushbackRead();     }   }   /**    * copied from {@link BufferedReader#readLine()}    *     * Reads a line of text. A line is considered to be terminated by any one of    * a line feed ('\n'), a carriage return ('\r'), or a carriage return    * followed immediately by a linefeed.    *     * @return A String containing the contents of the line, not including any    *         line-termination characters, or null if the end of the stream has    *         been reached    *     * @exception IOException    *                If an I/O error occurs    */   public synchronized String readLine() throws IOException {     fBuffer.setLength(0);     boolean eof = false;     for (;;) {       int b = read();       if (b == -1) {         eof = true;         break;       }       if (b == '\r') {         fLastWasCR = true;         break;       }       if (b == '\n') {         break;       }       fBuffer.append((char) (b & 0xFF));     }     return ((fBuffer.length() == 0) && eof) ? null : fBuffer.toString();   }   @Override   public synchronized void close() throws IOException {     super.close();     fBuffer = null;     fIn.close();   }   /**    * Push the given char so that the next() read will return this char    *     * @param c    *            char to push back    */   public synchronized void pushback(int c) {     fPushbackChar = c;   }   private int pushbackRead() {     int b = fPushbackChar;     fPushbackChar = 0;     return b;   }   private int streamRead() throws IOException {     int b = fIn.read();     if (fLastWasCR) {       fLastWasCR = false;       char c = (char) (b & 0xff);       if (c == '\n') {         return read();       }     }     return b;   }   private InputStream fIn;   private StringBuilder fBuffer;   private boolean fLastWasCR;   private int fPushbackChar; }