[Java]System propertiesとOutputStreamからの文字列取得

2017年1月5日木曜日

Java

Javaを使ったプログラムででエラーが起こった時に使っていたJavaのバージョンやOSの環境が知りたいことはよくある。
その度に確認するのも大変だよね。
なので、プログラムの起動時にSystem propertiesの値をログなんかに出力しておくといいかもしれない。

単純に標準出力に出力するのであれば、以下のようにすればいい。

PropertiesSample.java
class PropertiesSample {
    public static void main(String ...  args) {
        System.getProperties().list(System.out);
    }
}

Stringとして取り出したいのであれば、Propertiesクラス自体がMapを実装しているので、イテレートして取り出せばいい。

ここで、Stringとして取り出すもうひとつの方法を考えよう。
もし、PropertiesクラスがMapを実装しておらず、listメソッドしか持っていなかった場合、どうなるだろうか。

そんな場合はOutputStreamの出力先をバッファにして、そこからStringとして取り出せばいい。
そのためにはByteArrayOutputStreamを出力先として使う。

Properties::listメソッドはPrintStreamを受け付けるため、ByteArrayOutputStreamそのままではなく、PrintStreamのコンストラクタにByteArrayOutputStreamを渡す。

PropertiesSample2.java
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.IOException;

class PropertiesSample2 {
    public static void main(String ...  args) {
        try (ByteArrayOutputStream bs = new ByteArrayOutputStream();
             PrintStream ps = new PrintStream(bs)) {
            System.getProperties().list(ps);

            String properties = bs.toString("UTF-8");
            System.out.println(properties);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}