Java で一時的な作業ディレクトリを用意する場合に、こんなコードを書いていました:
まず System.getProperty( "java.io.tmpdir" ) で、システム上の一時ディレクトリ(例えば "/tmp")を取得し、そこにファイルセパレータと任意の文字列(上記例では "_abc" )を追加して作ってました。
これらの処理が終わった後の tmpdir 文字列の値は "/tmp/_abc/" となることを想定していて、例えば一時ファイルを作るのであれば、
みたいにして、tmpdir にファイル名を付けるだけでよい、という風に使っていました。
ところが、この System.getProperty( "java.io.tmpdir" ) の実行結果にシステム間で違いがあることがわかりました。Linux 系システムだと "/tmp" のような値が返ってきますが、Windows システムで実行すると "C:\Users\username\AppData\Local\Temp\" のような、最後に File.separator が付いている値が返ってくるようです。なのでその結果に対して、
要するに System.getProperty( "java.io.tmpdir" ) の実行結果はシステムによって末尾に File.separator が付いたり付かなかったりするようでした。これは想定外。
というわけで、今度からはこう書くことにしました:
File.separator で終わっていなかった場合だけ File.separator を付けて、で "_abc" と・・・ という感じに。これでシステム依存部分を回避できました。
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 の値は "C:\Users\username\AppData\Local\Temp\\_abc\" となってしまい、File.separator が2回繰り返しで付いてしまうことになってしまうようでした。tmpdir += ( File.separator + "_abc" + File.separator );
要するに 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" と・・・ という感じに。これでシステム依存部分を回避できました。