2016-03-27 53 views
0

私はファイルをtmpフォルダ内のフォルダに保存する必要があるエクスポート作業中です。各フォルダはエクスポートごとに異なる必要があります。System.setPropertyのスコープを、それを設定するメソッドだけに制限する方法はありますか?

だから私のexport()方法は下記ん:

System.setProperty("java.io.tmpdir", System.getProperty("java.io.tmpdir")+pathSpecificToFirstExport); 

のcreateTempFileメソッドは、その中のファイルを保存するSystem.getProperty("java.io.tmpdir")を使用しています。

上記の方法が実行されている間、私が本当にしたいことだけSystem.getProperty("java.io.tmpdir")+pathSpecificToSecondExportありながら、export()に別のコールがSystem.getProperty("java.io.tmpdir")+pathSpecificToFirstExport+pathSpecificToSecondExportに新しいSystem.getProperty("java.io.tmpdir")を設定します。

異なる環境でSystem.getProperty("java.io.tmpdir")が変更されるたびに、新しいパスを追加するのではなく、System.getProperty("java.io.tmpdir")をハードコードすることはできません。私はそれが私によって行われていないとして、一時ファイルが作成される方法を変更することはできませんが、write()SXSSFWorkbook.javaので:ある

File tmplFile = TempFile.createTempFile("poi-sxssf-template", ".xlsx");

は私が探していますどのような方法だけのインスタンスにSystem.getProperty("java.io.tmpdir")の範囲を制限しますexport()

+3

これは[XY問題](http://xyproblem.info)です。 SXSSFWorkbookでは、この致命的なパスを継続するのではなく、何を達成しようとしているのかを尋ねる必要があります。 –

答えて

0

"java.io.tmpdir"の最初の値を一時変数に保存し、終了したら元に戻すことはできますか?

String defaultDir = System.getProperty("java.io.tmpdir") 
System.setProperty("java.io.tmpdir", System.getProperty("java.io.tmpdir")+pathSpecificToFirstExport); 
//createTempFile method 
System.setProperty("java.io.tmpdir",defaultDir); 
+0

別のエクスポートが開始されてから元の値にリセットされていない間は、 –

0

できません。 setPropertyは常にグローバルです。代わりに何をするべきかは、

Files.createTempDirectory(System.getProperty("java.io.tempdir") + pathSpecificToFirstExport); 
+0

ありがとうございます。残念ながら、createTempDirectoryは私が変更できない別のメソッド(SXSSFWorkbookは私のために行う)によって行われているので、上記の変更はできません –

+1

プロパティをローカルに設定しようとすると、うまく動作しません。あなたの本当の疑問は、SXSSFWorkbookに必要な場所に一時ファイルを保存する方法です。 – elhefe

4

です。これはできません。 Systemプロパティオブジェクトは事実上グローバルであり、適用可能なスコープメカニズムはありません。

"java.io.tmpdir"に依存しない一時ファイルを作成するために、別のメカニズムを使用する必要があります。解決方法:createTempFile(String prefix, String suffix, File directory)を使用し、(たとえば)スレッドローカルを使用して、「現在の」一時ディレクトリを追跡します。

java.nio.Filesと同等の方法を使用してください。


createTempDirectoryが、私は(SXSSFWorkbook私のためにそれを行う)を変更することはできません他の方法で行われているので、残念ながら、私は上記の変更を加えることはできません。

だから私はSXSSFWorkbookで見ていたし、ここでそれは一時ファイルを作成しているところです。

/** 
* Write out this workbook to an Outputstream. 
* 
* @param stream - the java OutputStream you wish to write to 
* @exception IOException if anything can't be written. 
*/ 
public void write(OutputStream stream) throws IOException { 
    for (SXSSFSheet sheet : _xFromSxHash.values()) { 
     sheet.flushRows(); 
    } 

    //Save the template 
    File tmplFile = File.createTempFile("poi-sxssf-template", ".xlsx"); 
    tmplFile.deleteOnExit(); 
    FileOutputStream os = new FileOutputStream(tmplFile); 
    _wb.write(os); 
    os.close(); 

    //Substitute the template entries with the generated sheet data files 
    injectData(tmplFile, stream); 
    tmplFile.delete(); 
} 

まず、Apacheの-POIはオープンソースであり、それはあなたがに自由であることを意味し必要に応じて変更してください。この場合、writeメソッドを変更する方が、グローバルな一時ディレクトリを使いこなして別の動作をさせるよりも優れています。

しかし、これは質問をします。なぜこれをやろうとしていますか? writeのコードを見ると、このメソッドがそれ自身の後にクリーンアップするように設計されていることは明らかです。 writeが正常に終了すると、メソッドが戻る前に一時ファイルが削除されます。異常終了した場合は、JVMの終了時にファイルをクリーンアップする必要があります。

上記にもかかわらず、一時ファイルがまだ「漏れている」場合、定期的にそれらを見つけて削除する外部スクリプトを書くのは簡単なことです。

-2

あなたはのmavenからジョブを実行できる場合は、

mvn <command to execute job> -Djava.io.tmpdir=absolutePathSpecificToFirstExport 

を試してみて、各ジョブのMVN命令を実行できるコマンド。

関連する問題