bug 57919: close opened resources

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1799316 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Javen O'Neal 2017-06-20 08:13:58 +00:00
parent 46b5d839c3
commit 171692edf2
2 changed files with 36 additions and 8 deletions

View File

@ -31,6 +31,7 @@ import java.util.zip.Checksum;
import org.apache.poi.EmptyFileException; import org.apache.poi.EmptyFileException;
import org.apache.poi.POIDocument; import org.apache.poi.POIDocument;
import org.apache.poi.ss.usermodel.Workbook;
public final class IOUtils { public final class IOUtils {
private static final POILogger logger = POILogFactory.getLogger( IOUtils.class ); private static final POILogger logger = POILogFactory.getLogger( IOUtils.class );
@ -209,6 +210,14 @@ public final class IOUtils {
} }
} }
public static void write(Workbook doc, OutputStream out) throws IOException {
try {
doc.write(out);
} finally {
closeQuietly(out);
}
}
/** /**
* Write a POI Document ({@link org.apache.poi.ss.usermodel.Workbook}, {@link org.apache.poi.sl.usermodel.SlideShow}, etc) to an output stream and close the output stream. * Write a POI Document ({@link org.apache.poi.ss.usermodel.Workbook}, {@link org.apache.poi.sl.usermodel.SlideShow}, etc) to an output stream and close the output stream.
* This will attempt to close the output stream at the end even if there was a problem writing the document to the stream. * This will attempt to close the output stream at the end even if there was a problem writing the document to the stream.
@ -265,6 +274,16 @@ public final class IOUtils {
closeQuietly(doc); closeQuietly(doc);
} }
} }
// Since the Workbook interface doesn't derive from POIDocument
// We'll likely need one of these for each document container interface
public static void writeAndClose(Workbook doc, OutputStream out) throws IOException {
try {
doc.write(out);
} finally {
closeQuietly(doc);
}
}
/** /**
* Copies all the data from the given InputStream to the OutputStream. It * Copies all the data from the given InputStream to the OutputStream. It

View File

@ -24,11 +24,11 @@ import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.util.IOUtils;
import org.apache.poi.util.TempFile; import org.apache.poi.util.TempFile;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@ -39,7 +39,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
*/ */
public class XSSFTestDataSamples { public class XSSFTestDataSamples {
/** /**
* Used by {@link writeOutAndReadBack(R wb, String testName)}. If a * Used by {@link #writeOutAndReadBack(Workbook, String)}. If a
* value is set for this in the System Properties, the xlsx file * value is set for this in the System Properties, the xlsx file
* will be written out to that directory. * will be written out to that directory.
*/ */
@ -74,6 +74,21 @@ public class XSSFTestDataSamples {
* @throws IOException * @throws IOException
*/ */
public static <R extends Workbook> File writeOut(R wb, String testName) throws IOException { public static <R extends Workbook> File writeOut(R wb, String testName) throws IOException {
final File file = getOutputFile(testName);
writeOut(wb, file);
return file;
}
private static <R extends Workbook> void writeOut(R wb, File file) throws IOException {
IOUtils.write(wb, new FileOutputStream(file));
}
// Anticipates the location of where a workbook will be written to
// Note that if TEST_OUTPUT_DIR is not set, this will create temporary files
// with unique names. Subsequent calls with the same argument may return a different file.
// Gets a test data sample file, deleting the file if it exists.
// This is used in preparation for writing a workbook out to the returned output file.
private static File getOutputFile(String testName) throws IOException {
final String testOutputDir = System.getProperty(TEST_OUTPUT_DIR); final String testOutputDir = System.getProperty(TEST_OUTPUT_DIR);
final File file; final File file;
if (testOutputDir != null) { if (testOutputDir != null) {
@ -85,12 +100,6 @@ public class XSSFTestDataSamples {
if (file.exists()) { if (file.exists()) {
file.delete(); file.delete();
} }
final OutputStream out = new FileOutputStream(file);
try {
wb.write(out);
} finally {
out.close();
}
return file; return file;
} }