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 }