Java FileInputStream未关闭
我有以下代码来设置Excel文件:Java FileInputStream未关闭,java,apache-poi,Java,Apache Poi,我有以下代码来设置Excel文件: public static void setExcelFile(String Path) throws Exception { try { FileInputStream ExcelFile = new FileInputStream(Path); ExcelWBook = new XSSFWorkbook(ExcelFile); } catch (Exception e){ Log.error(
public static void setExcelFile(String Path) throws Exception {
try {
FileInputStream ExcelFile = new FileInputStream(Path);
ExcelWBook = new XSSFWorkbook(ExcelFile);
} catch (Exception e){
Log.error("Class Utils | Method setExcelFile | Exception desc : "+e.getMessage());
}
}
这将从另一个类中的循环调用。此循环将对某个位置中的每个Excel文件重复。对于每个Excel文件,是否每次都需要关闭FileInputStream
?如果我没有在每个Excel文件的末尾关闭。它会对内存利用率产生影响吗?或者每次为下一个Excel文件创建新的Filestream对象时,它是否会自动关闭上一个对象并为当前文件创建?我遇到了以下错误消息的问题
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.OutOfMemoryError: Java heap space
at org.apache.xmlbeans.impl.store.Cur.createElementXobj(Cur.java:260)
at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.startElement(Cur.java:2997)
at org.apache.xmlbeans.impl.store.Locale$SaxHandler.startElement(Locale.java:3211)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.reportStartTag(Piccolo.java:1082)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseAttributesNS(PiccoloLexer.java:1822)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseOpenTagNS(PiccoloLexer.java:1521)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseTagNS(PiccoloLexer.java:1362)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:4682)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yylex(Piccolo.java:1290)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yyparse(Piccolo.java:1400)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:714)
at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3479)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1277)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1264)
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument$Factory.parse(Unknown Source)
at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:194)
at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:186)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:354)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:166)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:263)
at utility...
线程“main”java.lang.reflect.InvocationTargetException中的异常
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
原因:java.lang.OutOfMemoryError:java堆空间
在org.apache.xmlbeans.impl.store.Cur.createElementXobj(Cur.java:260)上
位于org.apache.xmlbeans.impl.store.Cur$CurLoadContext.startElement(Cur.java:2997)
位于org.apache.xmlbeans.impl.store.Locale$SaxHandler.startElement(Locale.java:3211)
位于org.apache.xmlbeans.impl.piccolo.xml.piccolo.reportStartTag(piccolo.java:1082)
位于org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseAttributesNS(PiccoloLexer.java:1822)
位于org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseOpenTagNS(PiccoloLexer.java:1521)
位于org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseTagNS(PiccoloLexer.java:1362)
位于org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:4682)
位于org.apache.xmlbeans.impl.piccolo.xml.piccolo.yylex(piccolo.java:1290)
请访问org.apache.xmlbeans.impl.piccolo.xml.piccolo.yyprase(piccolo.java:1400)
位于org.apache.xmlbeans.impl.piccolo.xml.piccolo.parse(piccolo.java:714)
位于org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3479)
位于org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1277)
位于org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1264)
在org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
位于org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument$Factory.parse(未知源)
位于org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:194)
位于org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:186)
位于org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:354)
位于org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:166)
位于org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:263)
实用的。。。
在使用完资源后,应在catch块中添加
ExcelFile.close()
[]。这样做是为了防止内存泄漏,在您的情况下,还会发生异常。如果不关闭流,文件将被锁定,直到inputstream关闭或JVM关闭。您应该关闭流,否则您可能会在下次从java读取该文件或直接使用windows时遇到IOException,正如其他人已经告诉您的那样:是的,您应该始终关闭流。此外,在某些系统上,每个未关闭和未最终确定的流将持有一个文件句柄,并且每个进程可能会运行一个最大值。(这取决于您的操作系统。)
在上面的上下文中,最简单的方法可能是使用try-with-resources构造自动关闭:
try (
FileInputStream ExcelFile = new FileInputStream(Path);
) {
ExcelWBook = new XSSFWorkbook(ExcelFile);
} catch (Exception e) {
Log.error("Class Utils | Method setExcelFile | Exception desc : "+ e.getMessage());
}
发件人:
构造一个XSSFWorkbook对象,方法是将整个流缓冲到内存中,然后为其打开一个对象
使用InputStream
比使用文件需要更多的内存,因此如果文件可用,那么您应该改为执行以下操作
OPCPackage pkg = OPCPackage.open(path);
XSSFWorkbook wb = new XSSFWorkbook(pkg);
// work with the wb object
......
pkg.close(); // gracefully closes the underlying zip file
因为您有一个路径字符串,所以应该使用或简单地使用
就关闭资源而言:。发件人:
应通过明确调用为此目的定义的清理方法,尽快回收昂贵的资源。如果不这样做,则系统性能可能会降低。在最坏的情况下,系统甚至可能完全失败
资源包括:
- 输入输出流
- 数据库结果集、语句和连接
- 线程
- 图形资源
- 插座
根据需要,文件的内存低于流