2011-12-09 2 views
0

ユニットテストでは、不正なプロパティ値の処理をテストする設定ファイルを上書きしています。 私は、Apache CommonsのIOを使用しています:Java copy-overwriteファイル。読み込み時に古いファイルを取得する

org.apache.commons.io.FileUtils.copyFile(new File(configDir, "xyz.properties.badValue"), new File(configDir, "xyz.properties"), false) 

ファイルシステムを調べるとき、私はxyz.propertiesが実際に上書きされていることがわかります - サイズが更新されたコンテンツは、xyz.properties.badValueのものと同じです。

FileReaderオブジェクトを使用して)プロパティオブジェクトにファイルを読み込むコードを通過するテストケースを完了すると、新しくコピーされたバージョンではなく、元のxyz.propertiesファイルのプロパティが取得されます。

私がファイルをシングルステップで調べて調べることで、ファイルシステムに書き込むタイミングの問題であることを除外できます。

コピーステップは何らかの形でファイルハンドルを保持していますか?もしそうなら、私は再びそれを解放するだろうか? もしそうでなければ、なぜこれが起こり、どうやってそれを解決するのか誰も知りませんか?

ありがとうございました。

+0

コピーメソッドはすべてのハンドルを適切に閉じます。それ以上の情報がなければ、支援するのが難しいかもしれません。エラーを再現できる最小のテストケースはありますか? –

答えて

1

これはあなたの質問に直接答えるものではありませんが、2つの別々のファイルを管理し、実行時に構成ファイルの名前を設定するようにコードを調整する方が良いと思います。こうすることで、テストでは、単一のファイルを上書きするのではなく、どの設定ファイルを使用するかを指定できます。

2

このオブジェクトの前にFileReaderオブジェクトを初期化した場合、古いバージョンの一時コピーがすでに格納されています。あなたはそれをリセットする必要があります

FileReader f = new FileReader("the.file"); 

// Copy and overwrite "the.file" 

f = new FileReader("the.file"); 

Unixファイルシステムのモデルでは、ファイルの内容を含むinodeは限り誰かがファイルにオープンfilehandleを持っている、またはディレクトリがあるとして持続しますそれを指すエントリ。ディレクトリ内のファイルの名前の交換

は、inode(ファイルの内容)を削除しませんので、ごすでにオープンfilehandleを使用し続けることができます。

これは実際には、決してクリーンアップする必要のない一時ファイルを作成するために悪用されます。ファイルを作成し、開いたままにしてすぐにリンクを解除します。ファイルハンドルを閉じると、inodeが刈られます

+0

... Unixのファイルシステムモデルでは、ファイルの内容を含む 'inode'は、誰かがファイルへのオープンファイルハンドルを持っている限り持続します。*または*そこにはディレクトリエントリがあります。ディレクトリ内のファイルの* name *を置き換えても 'inode'(ファイルの内容)は削除されないので、すでに開いているファイルハンドルを引き続き使用することができます。これは、実際には、決してクリーンアップする必要のない一時ファイルを作成するために悪用されます。ファイルを作成し、開いたままにしてすぐにファイルを「リンク解除」します。ファイルハンドルを閉じると 'inode'が刈られます。 – BRFennPocock

関連する問題