/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.dev.util; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.UnsupportedEncodingException; import java.io.Writer; import org.h2.engine.Constants; import org.h2.message.DbException; /** * The reader input stream wraps a reader and convert the character to the UTF-8 * format. */ public class ReaderInputStream extends InputStream { private final Reader reader; private final char[] chars; private final ByteArrayOutputStream out; private final Writer writer; private int pos; private int remaining; private byte[] buffer; public ReaderInputStream(Reader reader) { chars = new char[Constants.IO_BUFFER_SIZE]; this.reader = reader; out = new ByteArrayOutputStream(Constants.IO_BUFFER_SIZE); try { writer = new BufferedWriter(new OutputStreamWriter(out, Constants.UTF8)); } catch (UnsupportedEncodingException e) { throw DbException.convert(e); } } private void fillBuffer() throws IOException { if (remaining == 0) { pos = 0; remaining = reader.read(chars, 0, Constants.IO_BUFFER_SIZE); if (remaining < 0) { return; } writer.write(chars, 0, remaining); writer.flush(); buffer = out.toByteArray(); remaining = buffer.length; out.reset(); } } public int read() throws IOException { if (remaining == 0) { fillBuffer(); } if (remaining < 0) { return -1; } remaining--; return buffer[pos++] & 0xff; } }