abstract class ByteBufInputStream extends InputStream {
private InputStream is;
- public InputStream next;
+ public Stream next = null;
private byte[] buf = new byte[8192];
private int start = 0;
private int end = 0;
this.is = is;
}
+ public void appendStream(Stream next) {
+ if (this.next == null) this.next = next;
+ else this.next.appendStream(next);
+ }
private int bufSize() { if (end==start) { end = start = 0; } return end-start; }
private int fillBufIfEmpty() {
try {
if (bufSize() > 0) return bufSize();
+ if (is == null) return -1;
+ if (prereading) return -1;
start = 0;
do {
end = is.read(buf, 0, buf.length);
- if (end == -1 && next != null) {
+ if (end == -1) {
is.close();
- is = next;
- continue;
+ is = null;
+ if (next != null) {
+ // FIXME: append to a stream that has already run out?
+ is = next.getInputStream();
+ next = null;
+ start = end = 0;
+ continue;
+ }
}
} while(end==0);
if (end == -1) { end = 0; return -1; }
protected final In in;
protected final Out out;
private String newLine = "\r\n";
- private Stream in_next = null;
- public Stream(byte[] b, int off, int len) { this.in = new Stream.In(new ByteArrayInputStream(b, off, len)); this.out=null; }
+ public Stream(byte[] b, int off, int len) { this.in = new Stream.In(new ByteArrayInputStream(b, off, len)); this.out=null; }
public Stream(InputStream in) { this.in = new Stream.In(in); this.out = null; }
public Stream( OutputStream out) { this.in = null; this.out = new Stream.Out(out); }
public Stream(InputStream in, OutputStream out) { this.in = new Stream.In(in); this.out = new Stream.Out(out); }
public void print(String s) { out.write(s); flush(); }
public void println(String s) { print(s); print(newLine); }
public void flush() { if (out != null) out.flushWriter(); }
+ public void writeBytes(byte[] b, int off, int len) { try { out.write(b, off, len); } catch (IOException e) { ioe(e); } }
public int read(byte[] b, int off, int len) { flush(); return in.readBytes(b, off, len); }
public int read(char[] c, int off, int len) { flush(); return in.readChars(c, off, len); }
public void close() { try { if (in!=null) in.close(); } finally { if (out!=null) out.close(); } }
public void setNewline(String s) { newLine = s; }
+ public InputStream getInputStream() { return in; }
private static class Out extends BufferedOutputStream {
private Writer writer = new OutputStreamWriter(this);
public In(InputStream in) {
bbis = new ByteBufInputStream(in) {
public void preread() {
+ cbr.unbuffer(unreader);
try {
if (!cbr.ready()) return;
} catch (IOException e) { ioe(e); }
unreader = new OutputStreamWriter(new UnReaderStream(bbis));
cbr = new CharBufReader(new InputStreamReader(bbis));
}
-
}
- // Utilities: append() and transcribe() //////////////////////////////////////////////////////////////////////////////
+ // Utilities: append() and transcribe() ///////////////////////////////////////////////////////
public Stream append(String in_next) { return appendStream(new Stream(in_next)); }
- public Stream appendStream(Stream in_next) {
- if (this.in_next != null)
- this.in_next.appendStream(in_next);
- else
- this.in_next = in_next;
- return this;
- }
+ public Stream appendStream(Stream in_next) { in.bbis.appendStream(in_next); return this; }
public void transcribe(Stream out) { transcribe(out, false); }
public void transcribe(Stream out, boolean close) {
- try {
- byte[] buf = new byte[1024];
- while(true) {
- int numread = in.read(buf, 0, buf.length);
- if (numread==-1) { in.close(); break; }
- out.out.write(buf, 0, numread);
- }
- if (close) out.close();
- } catch (IOException ioe) { ioe(ioe); }
+ byte[] buf = new byte[1024];
+ while(true) {
+ int numread = in.read(buf, 0, buf.length);
+ if (numread==-1) { in.close(); break; }
+ out.writeBytes(buf, 0, numread);
+ }
+ if (close) out.close();
}
public void transcribe(StringBuffer out) {
}
public static int countLines(Stream s) {
- System.out.println("counting lines...");
int ret = 0;
while(s.readln() != null) ret++;
s.close();
return ret;
}
+ // FIXME: ugly
+ public static int countBytes(Stream s) {
+ int ret = 0;
+ while(s.in.read() != -1) ret++;
+ s.close();
+ return ret;
+ }
+
// Exceptions //////////////////////////////////////////////////////////////////////////////
static int ioe(IOException e) {