我正在阅读 Poi(3.7) 的 Excel 文件。我正在这个链接Poi快速指南学习一些关于poi的东西。现在我担心的是这个:
打开工作簿(.xls HSSFWorkbook 或 .xlsx XSSFWorkbook)时,可以从文件或输入流加载工作簿。使用 File 对象可以降低内存消耗,而 InputStream 需要更多内存,因为它必须缓冲整个文件
在 Poi 3.7 版本中,WorkbookFactory 没有以下方法
WorkbookFactory.create(new File("MyExcel.xls"))
我尝试通过这些方式加载我的文件:
第一种方法
InputStream is = (InputStream) getClass().getResourceAsStream("/MyExcel.xlsx");
Workbook wb = WorkbookFactory.create(is);
第二种方式
String path = getClass().getResource("/MyExcel.xlsx").getPath();
FileInputStream fis = new FileInputStream(new File(path));
Workbook wb = WorkbookFactory.create(fis);
现在我想问你,这三种加载Excel文件的可能性有什么背景差异?您建议其中哪一个?
如果您的文件位于文件系统中,则第一种方法很好。第二种方法其实是错误的。如果您的文件是应用程序的一部分,即可从类路径获取,请使用以下代码:
Workbook wb = WorkbookFactory.create(getClass().getResourceAsStream("/MyExcel.xlsx").getPath());
你的代码有什么问题吗?实际上,只有当您的类直接位于文件系统中时,它才可能起作用。然而,如果它们被打包到 jar 中,则
new FileInputStream(new File(path))
行将抛出 FileNotFoundException
,因为文件确实不存在于文件系统中,但打包到 jar 中。
我可以告诉你我遇到了什么问题以及InputStream如何为我解决这个问题,然后你可以决定使用哪一个。
我使用了 getResource("").getFile() ,它为什么在我的 IDEA 上运行,因为它可以在后台创建文件。当我将服务器提取为 Jar 并从 cmd 执行它时,它不起作用,因为在 Jar 的资源内部它无权创建任何内容。
结论: InputStream不需要系统访问 文件需要访问系统
使用 InputStream 比使用 File 具有更高的内存占用