2016-03-27 5 views
0

Ich arbeite an einem Export, der erfordert, dass die Dateien in einem Ordner im Ordner tmp gespeichert werden, und jeder Ordner muss für verschiedene Exporte unterschiedlich sein.Wie kann ich den Gültigkeitsbereich von System.setProperty auf nur die Methode beschränken, die es festlegt?

Also meine export() Methode hat die folgenden:

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

die createTempFile Methode nutzt System.getProperty("java.io.tmpdir") die Dateien darin zu speichern.

Während das obige Verfahren ausgeführt wird, ein weiterer Anruf auf export() setzt die neuen System.getProperty("java.io.tmpdir")-System.getProperty("java.io.tmpdir")+pathSpecificToFirstExport+pathSpecificToSecondExport während das, was ich will wirklich nur System.getProperty("java.io.tmpdir")+pathSpecificToSecondExport ist.

Ich kann nicht System.getProperty("java.io.tmpdir")System.getProperty("java.io.tmpdir") HardCode codieren, anstatt neuen Pfad an es jedes Mal als System.getProperty("java.io.tmpdir") Änderungen für verschiedene Umgebungen anzuhängen. Ich kann nicht die Art und Weise temporäre Datei erstellt wird, da es nicht von mir gemacht wird, sondern durch write() von SXSSFWorkbook.java:

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

Was ich suche, ist der Umfang der System.getProperty("java.io.tmpdir") nur auf die Instanz des Verfahrens zu begrenzen export()

Irgendwelche Gedanken?

+3

Dies ist ein [XY Problem] (http://xyproblem.info). Sie sollten sich fragen, was Sie eigentlich mit SXSSFWorkbook erreichen wollen, anstatt diesen Sackgassen-Pfad weiter zu verfolgen. –

Antwort

0

Können Sie den ersten Wert von "java.io.tmpdir" in einer temporären Variablen speichern und ihn nach Abschluss des Vorgangs zurücksetzen?

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

Nicht, während ein anderer Export beginnt, bevor er auf den ursprünglichen Wert zurückgesetzt wird. –

0

Sie können nicht. setProperty ist immer global. Was Sie stattdessen tun sollten, ist etwas wie

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

Danke. Leider kann ich nicht die obige Änderung vornehmen, da die createTempDirectory durch ein anderes Verfahren durchgeführt wird, die ich nicht ändern kann (SXSSFWorkbook macht das für mich) –

+1

Sie wahrscheinlich Ihr brauchen neu zu schreiben (oder eine neue schreiben) Frage ist dann, wie der Versuch, eine Eigenschaft lokal zu setzen nicht zur Arbeit gehen. Es klingt wie Ihre wahre Frage ist, wie SXSSFWorkbook zu speichern temporäre Dateien, wo Sie wollen. – elhefe

4

Sie können das nicht tun. Das System Properties-Objekt ist effektiv global und es gibt keinen gültigen Scoping-Mechanismus.

Sie müssen einen anderen Mechanismus zum Erstellen temporärer Dateien verwenden, der nicht von der "java.io.tmpdir" abhängt. Lösung: Verwenden Sie createTempFile(String prefix, String suffix, File directory), und verfolgen Sie das "aktuelle" temporäre Verzeichnis mit (zum Beispiel) Thread-Locals.

Besser noch, verwenden Sie die äquivalente Methode in java.nio.Files.


Leider kann ich nicht die obige Änderung vornehmen, da die createTempDirectory durch ein anderes Verfahren durchgeführt wird, die ich nicht ändern kann (SXSSFWorkbook tut das für mich).

Also nahm ich einen Blick auf SXSSFWorkbook, und hier ist, wo es temporäre Dateien zu erstellen:

/** 
* 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(); 
} 

Zunächst einmal ist Apache-POI Open Source, und das bedeutet, dass Sie frei sind Ändern Sie es, wenn Sie müssen. In diesem Fall wäre es besser, die write-Methode zu ändern, als zu versuchen, das Verhalten anders zu gestalten, indem Sie mit dem globalen temporären Verzeichnis herumspielen.

Aber das wirft die Frage auf: Warum versuchen Sie, dies zu tun? Betrachtet man den Code von write, ist es ziemlich klar, dass die Methode entworfen ist, nach sich selbst aufzuräumen. Wenn write normal beendet wird, wird die temporäre Datei gelöscht, bevor die Methode zurückgegeben wird. Wenn es abnormal beendet wird, sollte die Datei beim Beenden der JVM bereinigt werden.

Und wenn, trotz der oben, temporären Dateien noch sind „undicht“, dann sollte es einfach sein, ein externes Skript zu schreiben, und löscht sie findet in regelmäßigen Abständen.

-2

Wenn Sie die Aufträge ausführen können von Maven-Befehlen Sie

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

und führen Sie einen Befehl MVN für jeden Job versuchen.

Verwandte Themen