All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.commons.ssl.util.ReadLine Maven / Gradle / Ivy

There is a newer version: 0.3.20
Show newest version
package org.apache.commons.ssl.util;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author Julius Davies
 * @author 23-Dec-2007
 */
public class ReadLine {

    final InputStream in;
    final byte[] bytes = new byte[8192];
    int pos = 0;
    int avail = 0;

    public ReadLine(InputStream in) { this.in = in; }

    public String next() throws IOException { return next(1); }

    public String next(int lines) throws IOException {
        if (lines < 1) {
            lines = 1;
        }
        StringBuffer buf = new StringBuffer(128 * lines);
        if (avail <= 0 || pos >= avail) {
            pos = 0;
            avail = in.read(bytes);
        }
        while (avail >= 0) {
            while (pos < avail) {
                char c = (char) bytes[pos++];
                switch (c) {
                    case '\n':
                    case '\r':
                        lines--;
                        if (lines < 1 && buf.length() > 0) {
                            return buf.toString();
                        }
                        break;
                    default:
                        buf.append(c);
                        break;
                }
            }
            pos = 0;
            avail = in.read(bytes);
        }
        return buf.length() > 0 ? buf.toString() : null;
    }

    public byte[] nextAsBytes() throws IOException { return nextAsBytes(1); }

    public byte[] nextAsBytes(int lines) throws IOException {
        if (lines < 1) {
            lines = 1;
        }
        byte[] buf = new byte[8192];
        int bufPos = 0;
        if (avail <= 0 || pos >= avail) {
            pos = 0;
            avail = in.read(bytes);
        }
        while (avail >= 0) {
            while (pos < avail) {
                byte b = bytes[pos++];
                switch (b) {
                    case '\n':
                    case '\r':
                        lines--;
                        if (lines == 0 && bufPos > 0) {
                            return buf;
                        }
                        break;
                    default:
                        if (bufPos >= buf.length) {
                            byte[] moreBuff = new byte[buf.length * 2];
                            System.arraycopy(buf, 0, moreBuff, 0, buf.length);
                            buf = moreBuff;
                        }
                        buf[bufPos++] = b;
                        break;
                }
            }
            pos = 0;
            avail = in.read(bytes);
        }
        return bufPos > 0 ? buf : null;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy