/**
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.common.io;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * ファイルを扱うユーティリティ
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.5 $
 */
public class FileUtils {
	/**
	 * 指定値で指定バイト分のデータを出力する
	 * @param filename ファイル名
	 * @param length 長さ
	 * @param data 埋め込むデータ
	 * @throws IOException 入出力エラー
	 */
	public static final void fill(String filename, int length, int data) throws IOException {
		BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream(filename));

		for(int i = 0; i < length; i++) {
			bw.write(data);
		}
		bw.flush();
		bw.close();
	}
	/**
	 * 指定されたファイルを末端まで読み込み，文字列で返す
	 * @param file ファイル
	 * @param encoding ファイルのエンコーディング
	 * @return 読み込んだファイルの内容
	 * @throws IOException ファイルアクセスに失敗した場合に発生する例外
	 */
	public static final String readFully(File file, String encoding) throws IOException {
		BufferedReader br = null;
		if(encoding == null) {
			br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
		} else {
			br = new BufferedReader(new InputStreamReader(new FileInputStream(file), encoding));
		}

		StringBuffer sb = new StringBuffer();
		String line = null;
		
		while((line = br.readLine()) != null) {
			sb.append(line);
		}

		br.close();
		
		return sb.toString();
	}
	/**
	 * 指定されたファイルを末端まで読み込み，バイト列で返す．
	 * @param file ファイル
	 * @return 読み込んだファイルの内容
	 * @throws IOException ファイルアクセスに失敗した場合に発生する例外
	 */
	public static final byte[] binaryReadFully(File file) throws IOException {
		byte[] buffer = new byte[(int)file.length()];
		FileInputStream fi = new FileInputStream(file);
		int len = fi.read(buffer);
		if(len < buffer.length) {
			throw new IOException();
		}
		fi.close();

		return buffer;
	}
	/**
	 * 指定されたファイルを末端まで読み込み，文字列で返す
	 * @param filename ファイル名
	 * @param encoding ファイルのエンコーディング
	 * @return 読み込んだファイルの内容
	 * @throws IOException ファイルアクセスに失敗した場合に発生する例外
	 */
	public static final String readFully(String filename, String encoding) throws IOException {
		return readFully(new File(filename), encoding);
	}
	/**
	 * パス名を連結する
	 * @param pathElements 連結対象のパスエレメント
	 * @return 適切に連結された文字列
	 */
	public static final String concat(String[] pathElements) {
		if(pathElements == null || pathElements.length == 0) {
			return "";
		}
		StringBuffer sb = new StringBuffer();

		for(int i = 0; i < pathElements.length; i++) {		
			if(i > 0 && File.separator.equals("" + sb.charAt(sb.length()-1)) == false) { 
				sb.append(File.separator);
			}
			sb.append(pathElements[i]);
		}

		return sb.toString().trim();
	}
}
