Java FileInputStream未关闭

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(

我有以下代码来设置Excel文件:

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
因为您有一个路径字符串,所以应该使用或简单地使用

就关闭资源而言:。发件人:

应通过明确调用为此目的定义的清理方法,尽快回收昂贵的资源。如果不这样做,则系统性能可能会降低。在最坏的情况下,系统甚至可能完全失败

资源包括:

  • 输入输出流
  • 数据库结果集、语句和连接
  • 线程
  • 图形资源
  • 插座
根据需要,文件的内存低于流