【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");  
		  
		<span style="color: red;"><strong>ps = new PrintStream(new File("nul"));</strong></span> <span style="color: green;">// // ←nulデバイスのStreamをつくる</span>  
		<span style="color: red;"><strong>System.setOut(ps);</strong></span> <span style="color: green;">// // ←標準出力をnulデバイスに割り当て直す</span>  
		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"));で同じことが出来るんだろう、多分。(試してないけど)
今度暇なときやってみようと思う。