【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"));で同じことが出来るんだろう、多分。(試してないけど)
今度暇なときやってみようと思う。