Java で一時的な作業ディレクトリを用意する場合に、こんなコードを書いていました:
String tmpdir = System.getProperty( "java.io.tmpdir" );  //. システムの一時ディレクトリ
tmpdir += ( File.separator + "_abc" + File.separator );
   :

まず System.getProperty( "java.io.tmpdir" ) で、システム上の一時ディレクトリ(例えば "/tmp")を取得し、そこにファイルセパレータと任意の文字列(上記例では "_abc" )を追加して作ってました。

これらの処理が終わった後の tmpdir 文字列の値は "/tmp/_abc/" となることを想定していて、例えば一時ファイルを作るのであれば、
  :
String tmpfilepath = tmpdir + "test.txt"
  :

みたいにして、tmpdir にファイル名を付けるだけでよい、という風に使っていました。


ところが、この System.getProperty( "java.io.tmpdir" ) の実行結果にシステム間で違いがあることがわかりました。Linux 系システムだと "/tmp" のような値が返ってきますが、Windows システムで実行すると "C:\Users\username\AppData\Local\Temp\" のような、最後に File.separator が付いている値が返ってくるようです。なのでその結果に対して、
tmpdir += ( File.separator + "_abc" + File.separator );
を実行してしまうと、tmpdir の値は "C:\Users\username\AppData\Local\Temp\\_abc\" となってしまい、File.separator が2回繰り返しで付いてしまうことになってしまうようでした。

要するに System.getProperty( "java.io.tmpdir" ) の実行結果はシステムによって末尾に File.separator が付いたり付かなかったりするようでした。これは想定外。

というわけで、今度からはこう書くことにしました:
String tmpdir = System.getProperty( "java.io.tmpdir" );
tmpdir += ( ( tmpfolder.endsWith( File.separator ) ? "" : File.separator ) + "_abc" + File.separator );
   :

File.separator で終わっていなかった場合だけ File.separator を付けて、で "_abc" と・・・ という感じに。これでシステム依存部分を回避できました。