/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: InputOutputStreamPipe.java,v 1.1 2005/05/07 02:38:41 rampil Exp $
 */
package org.logical_paradox.common.io;

import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * InputStreamから読み込んでOutputStreamへ出力するパイプ役を果たすクラス
 * 入力ソースのInputStreamと出力先のOutputStreamは適切にバッファリングされているとする
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.1 $
 */
public class InputOutputStreamPipe {
	/** デフォルトの入出力バッファサイズ */
	public static int DEFAULT_BUFFER_SIZE = 16384;

	/** 入力ストリーム */
	private final InputStream in_;
	/** 出力ストリーム */
	private final OutputStream out_;
	/** バッファサイズ */
	private int bufferSize_ = DEFAULT_BUFFER_SIZE;

	/**
	 * コンストラクタ
	 * @param in 入力ストリーム
	 * @param out 出力ストリーム
	 */
	public InputOutputStreamPipe(InputStream in, OutputStream out) {
		in_ = in;
		out_ = out;
	}
	/**
	 * 入力ストリームのデータを全て出力ストリームへ出力し、両方のストリームをcloseする
	 * @throws 入出力例外
	 */
	public void throughAll() throws IOException, EOFException {
		byte[] buffer = new byte[getBufferSize()];
		int readByte = -1;
		while((readByte = in_.read(buffer)) >= 0) {
			if(readByte > 0) {
				out_.write(buffer, 0, readByte);
			}
		}

		close();
	}
	/**
	 * 入出力バッファサイズを設定する
	 * @param bufsiz バッファサイズ
	 */
	public void setBufferSize(int bufsiz) {
		bufferSize_ = bufsiz;
	}
	/**
	 * 入出力バッファサイズを返す
	 * @return 現在の入出力バッファサイズ
	 */
	public int getBufferSize() {
		return bufferSize_;
	}
	/**
	 * 入出力ストリームを両方クローズする
	 * @throws IOException クローズに失敗した
	 */
	public void close() throws IOException {
		in_.close();
		out_.close();
	}
}
