RM-BLOG

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【java】標準出力を闇に葬る(UNIXの> /dev/nullをjava内で再現)

UNIXでいう「標準出力を闇に葬る」のやりかた、すなわち↓

echo AAA > /dev/null


javaの中でだけ実現するやり方のメモ(Windows向け)


 

 
下記のようなやり方で実現可能。

	private static void execMain() throws Throwable {
		
		PrintStream ps = null;
		PrintStream stdout = System.out;
		try {
			System.out.println("TEST CHECK POINT 1");
			
			ps = new PrintStream(new File("nul")); // // ←nulデバイスのStreamをつくる
			System.setOut(ps); // // ←標準出力をnulデバイスに割り当て直す
			System.out.println("TEST CHECK POINT 2");
			
			System.setOut(stdout);
			System.out.println("TEST CHECK POINT 3");
			
		} catch(Throwable e) {
			throw e;
		} finally {
			if (ps != null) {
				ps.close();
			}
		}
		
		
	}


↑を実行すると、
「TEST CHECK POINT 1」「TEST CHECK POINT 3」は表示されるが「TEST CHECK POINT 2」は表示されない。

自分で書いてみてなかなかにトリッキーなやり方と感じる。
こんなの必要とするやつは俺くらいなのではないか。

System#setOutで標準出力先を変えることができるので、
Windowsでいうところの「/dev/null」に相当するnulデバイス(「nul」というファイル)を一時的に標準出力に割り当てる。
Windowsでいうと、エクスプローラー上で「nul」というファイル名でファイル作ると怒られるのだが
こういう実装する分には怒られないらしい。(FileOutputStreamのコンストラクタで怒られると思ってた)
ただし一度System#setOutで割当先を変えてしまうと復旧できないので
System.outを退避しておいて、最後にまた割り当て直す。

ちなみにFileOutputStream(new File("nul"));で作ったFileOutputStreamに対しては、
何を書き込んでもファイルが出力されない(FileOutputStream#writeメソッドの結果がファイルとして出力されてこない)
まさしくWindowsでいうところの「> nul」が実現されていることになる。




UNX系OSならFileOutputStream(new File("/dev/null"));で同じことが出来るんだろう、多分。(試してないけど)
今度暇なときやってみようと思う。