質問: 実装初心者です。始めて質問させていただきます。 至らない点ございましたら申し訳ございません、よろしくお願いよろしくお願いします。 ### 前提・実現したいこと 言語 :java DB :Postgresql .shファイルからjavaを実行し、PostgreSQLにてテーブル全データをTSV出力するバッチを作成しております。 PostgresqlのコマンドをプロパティファイルのKEY値に設定し、KEY値を呼び出すことで実行しようと考えています。 設定するKEY値は下記を想定しています。 ``` COPY テーブル名 TO '出力先絶対パス/ファイル名.tsv' WITH CSV NULL AS 'null' DELIMITER E'\t' ; ``` 上記内容をKEY1としたとき、'出力先絶対パス'もKEY2として設定することで、 KEY1を呼び出した後、KEY2も呼び出すことで、KEY2に設定したパスへKEY1に設定したコマンドによりTSVを取得することは可能でしょうか?
回答: プロパティの読み込みと、MessageFormatのプレースホルダを使うことで実現はできます。 ``` import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.text.MessageFormat; import java.util.Properties; /** * @author a-pz * */ public class MessagePropertiesReader { public String getMessage() throws IOException { InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("message.properties"); InputStreamReader reader = new InputStreamReader(inputStream, "utf8"); Properties properties = new Properties(); properties.load(reader); String command = properties.getProperty("command"); return MessageFormat.format(command, "/usr/local/bin"); } } ``` ただしプロパティファイル中にあるシングルクォートで囲まれた文字列の中身は、そのまま出力してしまいますので、以下のように書き換える必要があります。 ``` command=COPY テーブル名 TO {0}/ファイル名.tsv WITH CSV NULL AS 'null' DELIMITER E'\t' ; ``` 実行結果は次のようになります。 ``` COPY テーブル名 TO /usr/local/bin/ファイル名.tsv WITH CSV NULL AS null DELIMITER E ; ``` プレースホルダは複数の変数を指定可能です。