001 package org.apache.commons.ssl.util;
002
003 import java.io.IOException;
004 import java.io.InputStream;
005
006 /**
007 * @author Julius Davies
008 * @author 23-Dec-2007
009 */
010 public class ReadLine {
011
012 final InputStream in;
013 final byte[] bytes = new byte[8192];
014 int pos = 0;
015 int avail = 0;
016
017 public ReadLine(InputStream in) { this.in = in; }
018
019 public String next() throws IOException { return next(1); }
020
021 public String next(int lines) throws IOException {
022 if (lines < 1) {
023 lines = 1;
024 }
025 StringBuffer buf = new StringBuffer(128 * lines);
026 if (avail <= 0 || pos >= avail) {
027 pos = 0;
028 avail = in.read(bytes);
029 }
030 while (avail >= 0) {
031 while (pos < avail) {
032 char c = (char) bytes[pos++];
033 switch (c) {
034 case '\n':
035 case '\r':
036 lines--;
037 if (lines < 1 && buf.length() > 0) {
038 return buf.toString();
039 }
040 break;
041 default:
042 buf.append(c);
043 break;
044 }
045 }
046 pos = 0;
047 avail = in.read(bytes);
048 }
049 return buf.length() > 0 ? buf.toString() : null;
050 }
051
052 public byte[] nextAsBytes() throws IOException { return nextAsBytes(1); }
053
054 public byte[] nextAsBytes(int lines) throws IOException {
055 if (lines < 1) {
056 lines = 1;
057 }
058 byte[] buf = new byte[8192];
059 int bufPos = 0;
060 if (avail <= 0 || pos >= avail) {
061 pos = 0;
062 avail = in.read(bytes);
063 }
064 while (avail >= 0) {
065 while (pos < avail) {
066 byte b = bytes[pos++];
067 switch (b) {
068 case '\n':
069 case '\r':
070 lines--;
071 if (lines == 0 && bufPos > 0) {
072 return buf;
073 }
074 break;
075 default:
076 if (bufPos >= buf.length) {
077 byte[] moreBuff = new byte[buf.length * 2];
078 System.arraycopy(buf, 0, moreBuff, 0, buf.length);
079 buf = moreBuff;
080 }
081 buf[bufPos++] = b;
082 break;
083 }
084 }
085 pos = 0;
086 avail = in.read(bytes);
087 }
088 return bufPos > 0 ? buf : null;
089 }
090
091 }