001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.fukurou.util;
017
018 import java.io.FileInputStream;
019 import java.io.UnsupportedEncodingException;
020 import java.io.IOException;
021 import java.util.StringTokenizer;
022
023 /**
024 * FileString は、ファイルを読み取って、そのまま String ??として返すクラスです?
025 * SQLを記述したファイル??コマンドを記述したファイルを読み取って、コマンドラインからの
026 * 入力として利用できます?
027 *
028 * ファイルは、?すべて読み取ってメモリ上で?されます?
029 * パラメータ等?設定ファイルをイメージして?為、巨大なファイルの読み込みは出来ません?
030 *
031 * @version 4.0
032 * @author Kazuhiko Hasegawa
033 * @since JDK5.0,
034 */
035 public class FileString {
036 private String filename = null ;
037 private String encode = null ;
038 private String value = null ;
039
040 /**
041 * ファイル名を設定します?
042 * ??ファイルを読み取って、?部??に格納します?
043 * なお?格納するタイミングは?getValue() を最初に行ったときです?
044 * ファイル名を再設定すると、?部のvalue は、クリアされます?
045 *
046 * @param filename ファイル?
047 */
048 public void setFilename( final String filename ) {
049 if( filename == null ) {
050 String errMsg = "ファイル名が?されて?せん? ;
051 throw new RuntimeException( errMsg );
052 }
053
054 this.filename = filename;
055 value = null; // 初期?
056 }
057
058 /**
059 * ファイル名を取得します?
060 *
061 * @og.rev 5.2.3.0 (2010/12/01) 新規追?
062 *
063 * @return ファイル?
064 */
065 public String getFilename() {
066 return filename;
067 }
068
069 /**
070 * ファイルのエンコードを設定します?
071 * ??ファイルを読み取る場合?エンコードを?します?
072 * 正確には、バイナリ??タを読み取って、文字?に変換する場合に?
073 * String( byte[],String ) コンストラクタの引数に使用します?
074 * ?されて???合?、String( byte[] ) コンストラクタで変換します?
075 * エンコードを再設定すると、?部のvalue は、クリアされます?
076 *
077 * @param encode エンコード名
078 */
079 public void setEncode( final String encode ) {
080 this.encode = encode;
081 value = null; // 初期?
082 }
083
084 /**
085 * ファイルのエンコードを取得します?
086 * 正確には、?部??に変換したとき?エンコードです?
087 * null の場合?、無??つまりデフォルトエンコー?と
088 * なります?
089 *
090 * @og.rev 5.2.3.0 (2010/12/01) 新規追?
091 *
092 * @return ファイルのエンコー?
093 */
094 public String getEncode() {
095 return encode;
096 }
097
098 /**
099 * ファイルを読み取って、文字?を作?します?
100 *
101 * ??タの読取が完?に出来なかったときには??中までの??タを返します?
102 * ??エンコードが存在しな??合や、ファイルが存在しな??合??
103 * RuntimeException ?throw します?
104 *
105 * @return ファイルを読み取った文字?
106 * @throws RuntimeException ??エンコードが存在しなかったとき?
107 */
108 public String getValue() {
109 if( value != null ) { return value; }
110
111 FileInputStream file = null;
112 try {
113 file = new FileInputStream( filename );
114 byte[] buf = new byte[file.available()];
115 int len = file.read(buf);
116 if( len != buf.length ) {
117 String errMsg = "読み取りファイルの??タが?り捨てられました? +
118 "File=" + filename + " Length=" + len ;
119 LogWriter.log( errMsg );
120 }
121 if( encode != null ) {
122 value = new String( buf,encode );
123 }
124 else {
125 // value = new String( buf );
126 value = new String( buf,StringUtil.DEFAULT_CHARSET ); // 5.5.2.6 (2012/05/25) findbugs対?
127 }
128 }
129 catch( UnsupportedEncodingException ex ) {
130 String errMsg = "?されたエンコー?ングがサポ?トされて?せん?" + encode + "]" ;
131 throw new RuntimeException( errMsg,ex );
132 }
133 catch( IOException ex ) {
134 String errMsg = "ファイル名がオープン出来ませんでした?" + filename + "]" ;
135 throw new RuntimeException( errMsg,ex );
136 }
137 finally {
138 Closer.ioClose( file );
139 }
140
141 return value ;
142 }
143
144 /**
145 * ??区??で?された文字?配?を取得します?
146 * 区??が連続して?場合?、?の区??と認識します?
147 * 処??、java.util.StringTokenizer で、??る方法と同?す?
148 * 例えば?;" を指定すれ?、SQL を?記述しておくことが可能になります?
149 *
150 * @param delim ファイルを?割する区???
151 *
152 * @return ファイルを読み取った文字?
153 */
154 public String[] getValue( final String delim ) {
155
156 StringTokenizer token = new StringTokenizer( getValue(),delim );
157
158 String[] rtn = new String[token.countTokens()];
159
160 for( int i=0; token.hasMoreTokens(); i++ ) {
161 rtn[i] = token.nextToken();
162 }
163
164 return rtn ;
165 }
166 }