mirror of https://github.com/alibaba/easyexcel
Jiaju Zhuang
5 months ago
5 changed files with 152 additions and 11 deletions
@ -0,0 +1,136 @@ |
|||||||
|
/* ==================================================================== |
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
contributor license agreements. See the NOTICE file distributed with |
||||||
|
this work for additional information regarding copyright ownership. |
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
(the "License"); you may not use this file except in compliance with |
||||||
|
the License. You may obtain a copy of the License at |
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software |
||||||
|
distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
See the License for the specific language governing permissions and |
||||||
|
limitations under the License. |
||||||
|
==================================================================== */ |
||||||
|
|
||||||
|
package com.alibaba.excel.util; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.IOException; |
||||||
|
import java.nio.file.Files; |
||||||
|
import java.nio.file.Path; |
||||||
|
import java.nio.file.Paths; |
||||||
|
import java.nio.file.attribute.FileAttribute; |
||||||
|
import java.util.concurrent.locks.Lock; |
||||||
|
import java.util.concurrent.locks.ReentrantLock; |
||||||
|
|
||||||
|
import org.apache.poi.util.DefaultTempFileCreationStrategy; |
||||||
|
import org.apache.poi.util.TempFileCreationStrategy; |
||||||
|
|
||||||
|
import static org.apache.poi.util.TempFile.JAVA_IO_TMPDIR; |
||||||
|
|
||||||
|
/** |
||||||
|
* In the scenario where `poifiles` are cleaned up, the {@link DefaultTempFileCreationStrategy} will throw a |
||||||
|
* java.nio.file.NoSuchFileException. Therefore, it is necessary to verify the existence of the temporary file every |
||||||
|
* time it is created. |
||||||
|
* |
||||||
|
* @author Jiaju Zhuang |
||||||
|
*/ |
||||||
|
public class EasyExcelTempFileCreationStrategy implements TempFileCreationStrategy { |
||||||
|
/** |
||||||
|
* Name of POI files directory in temporary directory. |
||||||
|
*/ |
||||||
|
public static final String POIFILES = "poifiles"; |
||||||
|
|
||||||
|
/** |
||||||
|
* To use files.deleteOnExit after clean JVM exit, set the <code>-Dpoi.delete.tmp.files.on.exit</code> JVM property |
||||||
|
*/ |
||||||
|
public static final String DELETE_FILES_ON_EXIT = "poi.delete.tmp.files.on.exit"; |
||||||
|
|
||||||
|
/** |
||||||
|
* The directory where the temporary files will be created (<code>null</code> to use the default directory). |
||||||
|
*/ |
||||||
|
private volatile File dir; |
||||||
|
|
||||||
|
/** |
||||||
|
* The lock to make dir initialized only once. |
||||||
|
*/ |
||||||
|
private final Lock dirLock = new ReentrantLock(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates the strategy so that it creates the temporary files in the default directory. |
||||||
|
* |
||||||
|
* @see File#createTempFile(String, String) |
||||||
|
*/ |
||||||
|
public EasyExcelTempFileCreationStrategy() { |
||||||
|
this(null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates the strategy allowing to set the |
||||||
|
* |
||||||
|
* @param dir The directory where the temporary files will be created (<code>null</code> to use the default |
||||||
|
* directory). |
||||||
|
* @see Files#createTempFile(Path, String, String, FileAttribute[]) |
||||||
|
*/ |
||||||
|
public EasyExcelTempFileCreationStrategy(File dir) { |
||||||
|
this.dir = dir; |
||||||
|
} |
||||||
|
|
||||||
|
private void createPOIFilesDirectory() throws IOException { |
||||||
|
// Create our temp dir only once by double-checked locking
|
||||||
|
// The directory is not deleted, even if it was created by this TempFileCreationStrategy
|
||||||
|
if (dir == null || !dir.exists()) { |
||||||
|
dirLock.lock(); |
||||||
|
try { |
||||||
|
if (dir == null || !dir.exists()) { |
||||||
|
String tmpDir = System.getProperty(JAVA_IO_TMPDIR); |
||||||
|
if (tmpDir == null) { |
||||||
|
throw new IOException("System's temporary directory not defined - set the -D" + JAVA_IO_TMPDIR |
||||||
|
+ " jvm property!"); |
||||||
|
} |
||||||
|
Path dirPath = Paths.get(tmpDir, POIFILES); |
||||||
|
dir = Files.createDirectories(dirPath).toFile(); |
||||||
|
} |
||||||
|
} finally { |
||||||
|
dirLock.unlock(); |
||||||
|
} |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public File createTempFile(String prefix, String suffix) throws IOException { |
||||||
|
// Identify and create our temp dir, if needed
|
||||||
|
createPOIFilesDirectory(); |
||||||
|
|
||||||
|
// Generate a unique new filename
|
||||||
|
File newFile = Files.createTempFile(dir.toPath(), prefix, suffix).toFile(); |
||||||
|
|
||||||
|
// Set the delete on exit flag, but only when explicitly disabled
|
||||||
|
if (System.getProperty(DELETE_FILES_ON_EXIT) != null) { |
||||||
|
newFile.deleteOnExit(); |
||||||
|
} |
||||||
|
|
||||||
|
// All done
|
||||||
|
return newFile; |
||||||
|
} |
||||||
|
|
||||||
|
/* (non-JavaDoc) Created directory path is <JAVA_IO_TMPDIR>/poifiles/prefix0123456789 */ |
||||||
|
@Override |
||||||
|
public File createTempDirectory(String prefix) throws IOException { |
||||||
|
// Identify and create our temp dir, if needed
|
||||||
|
createPOIFilesDirectory(); |
||||||
|
|
||||||
|
// Generate a unique new filename
|
||||||
|
File newDirectory = Files.createTempDirectory(dir.toPath(), prefix).toFile(); |
||||||
|
|
||||||
|
//this method appears to be only used in tests, so it is probably ok to use deleteOnExit
|
||||||
|
newDirectory.deleteOnExit(); |
||||||
|
|
||||||
|
// All done
|
||||||
|
return newDirectory; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue