gpt4 book ai didi

java - 在多线程系统中处理POI临时文件

转载 作者:行者123 更新时间:2023-12-02 11:44:16 25 4
gpt4 key购买 nike

我正在使用 POI SXSSFWorkbook 在多线程系统中创建 XLSX 文件。由于我了解到使用“DefaultTempFileCreationStrategy”(使用 poifiles 目录)时处理临时文件存在问题,因此我为每个线程创建了自己的临时目录:

private TempFileCreationStrategy createTempFileCreationStrategy(File poiTempFileDirectory) {
return new TempFileCreationStrategy() {
@Override
public File createTempFile(String prefix, String suffix) throws IOException {
if (!poiTempFileDirectory.exists()) {
poiTempFileDirectory.mkdir();
}
File newFile = File.createTempFile(prefix, suffix, poiTempFileDirectory);
return newFile;
}

@Override
public File createTempDirectory(String prefix) throws IOException {
return null;
}
};
}

这是在完成处理 SXSSFWorkbook 对象时运行的代码:

try {
// Write the Stream and close it
workBook.write(outputStream);
outputStream.close();
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
throw e;
} catch (Exception e) {
throw e;
} finally {
// Close the workBook
workBook.close();
// deleting the temporary files
workBook.dispose();
}

但即便如此,我在处置过程中有时也会遇到异常。一个线程在尝试删除另一个线程的临时文件时抛出异常,消息为:

dc319a2c-a663-4cb7-9f13-f7e8cc14c186/poi-sxssf-sheet-xml6608967316211277648.gz (No such file or directory)

当目录名称中的 ID 是另一个线程的 threadID 时,就会发生这种情况。

知道为什么会发生这种情况吗?

最佳答案

您可以使用Thread Local,以便为每个线程获取单独的TempFileCreationStrategy对象。

欲了解更多信息,请参阅ThreadLocal

public class Main {
private static final ThreadLocal<TempFileCreationStrategy> threadLocal =
new ThreadLocal<TempFileCreationStrategy>() {
@Override protected TempFileCreationStrategy initialValue() {
File file = null;
// to do create thread folder
return createTempFileCreationStrategy( file );
}
};

private TempFileCreationStrategy createTempFileCreationStrategy(File poiTempFileDirectory) {
return new TempFileCreationStrategy() {
@Override
public File createTempFile(String prefix, String suffix) throws IOException {
if (!poiTempFileDirectory.exists()) {
poiTempFileDirectory.mkdir();
}
File newFile = File.createTempFile(prefix, suffix, poiTempFileDirectory);
return newFile;
}

@Override
public File createTempDirectory(String prefix) throws IOException {
return null;
}
};
}

public void process() {

TempFileCreationStrategy tempFileStrategy = threadLocal.get();

// to do excel file logic
}
}

关于java - 在多线程系统中处理POI临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48314556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com