繁体   English   中英

如何将System.setProperty的范围限制为仅用于设置它的方法?

[英]How can I limit the scope of System.setProperty to only to the method that sets it?

我正在进行导出,要求将文件存储在tmp文件夹内的文件夹中,并且对于不同的导出,每个文件夹必须不同。

所以我的export()方法执行以下操作:

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

createTempFile方法利用System.getProperty("java.io.tmpdir")在其中存储文件。

在上述方法运行时,对export()另一个调用将新的System.getProperty("java.io.tmpdir")System.getProperty("java.io.tmpdir")+pathSpecificToFirstExport+pathSpecificToSecondExport而我真正想要的是只是System.getProperty("java.io.tmpdir")+pathSpecificToSecondExport

我无法对System.getProperty("java.io.tmpdir")硬编码,而不能每次在不同环境下System.getProperty("java.io.tmpdir")更改时都向其添加新路径。 我无法更改临时文件的创建方式,因为它不是由我执行,而是由SXSSFWorkbook.java write() SXSSFWorkbook.java

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

我正在寻找的是将System.getProperty("java.io.tmpdir")的范围仅限制为方法export()的实例

有什么想法吗?

你不能那样做。 System属性对象实际上是全局的,没有适用于它的作用域机制。

您需要做的是使用另一种机制来创建不依赖于"java.io.tmpdir"临时文件。 解决方案:使用createTempFile(String prefix, String suffix, File directory) ,并使用(例如)线程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退出时清理文件。

而且,尽管有上述情况,但临时文件仍在“泄漏”,那么编写一个定期查找和删除它们的外部脚本应该是一件简单的事情。

您可以将“ 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);

你不能 setProperty始终是全局的。 相反,您应该做的是

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

如果可以通过maven命令运行作业,则可以尝试

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

并为每个作业运行一个mvn命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM