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    }