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 }