/*
 * LOGICAL-PARADOX.ORG b-tree library
 * Copyright (C)2004,2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: OnMemoryBtreeFragmentFile.java,v 1.2 2005/05/16 15:36:45 rampil Exp $
 */
package org.logical_paradox.common.btree;

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

import org.logical_paradox.common.io.MemoryMappedRandomAccessFile;

/**
 * メモリ上で管理するBtreeFragmentFile
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class OnMemoryBtreeFragmentFile extends BtreeAvailableList {
	private MemoryMappedRandomAccessFile file = new MemoryMappedRandomAccessFile();

	/**
	 * デフォルトコンストラクタ
	 *
	 */
	public OnMemoryBtreeFragmentFile() {
		this("");
	}
	/**
	 * コンストラクタ
	 * 断片化情報を無制限に保持する
	 */
	public OnMemoryBtreeFragmentFile(String filename) {
		this(filename, 0);
	}
	/**
	 * コンストラクタ
	 * 指定されたキャッシュサイズまでしか断片化情報を保持しない<br>
	 * cachesizeに0を指定した場合，無制限に保持する
	 * @param size キャッシュサイズ(キャッシュレコード数)
	 */
	public OnMemoryBtreeFragmentFile(String filename, int size) {
		super(filename, size);
	}

	/**
	 * 断片化ファイルのファイルサイズを返す
	 * @return ファイルサイズ
	 * @throws IOException 断片化ファイルにアクセスできなかった
	 */
	protected long getFileSize() throws IOException {
		if(file == null) {
			file = new MemoryMappedRandomAccessFile();
		}
		return file.length();
	}

	/**
	 * ファイルアクセスに必要な入力ストリームを返す
	 * 必ずファイルの先頭をポイントしている
	 * @return 入力ストリーム
	 * @throws IOException オープンに失敗した
	 */	
	protected InputStream getInputStream() throws IOException {
		file.seek(0);
		return file.getInputStream();
	}

	/**
	 * ファイルアクセスに必要な出力ストリームを返す
	 * 必ずファイルの先頭をポイントしている．また，このメソッドを呼ぶと既存のファイルは破棄される．
	 * @return 出力ストリーム
	 * @throws IOException オープンに失敗した
	 */
	protected OutputStream getOutputStream() throws IOException {
		file = new MemoryMappedRandomAccessFile();
		return file.getOutputStream();
	}

}
