文件与输入流

问题描述 投票:0回答:3

我正在阅读 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文件的可能性有什么背景差异?您建议其中哪一个?

java apache-poi
3个回答
0
投票

如果您的文件位于文件系统中,则第一种方法很好。第二种方法其实是错误的。如果您的文件是应用程序的一部分,即可从类路径获取,请使用以下代码:

Workbook wb = WorkbookFactory.create(getClass().getResourceAsStream("/MyExcel.xlsx").getPath());

你的代码有什么问题吗?实际上,只有当您的类直接位于文件系统中时,它才可能起作用。然而,如果它们被打包到 jar 中,则

new FileInputStream(new File(path))
行将抛出
FileNotFoundException
,因为文件确实不存在于文件系统中,但打包到 jar 中。


0
投票

我可以告诉你我遇到了什么问题以及InputStream如何为我解决这个问题,然后你可以决定使用哪一个。

我使用了 getResource("").getFile() ,它为什么在我的 IDEA 上运行,因为它可以在后台创建文件。当我将服务器提取为 Jar 并从 cmd 执行它时,它不起作用,因为在 Jar 的资源内部它无权创建任何内容。

结论: InputStream不需要系统访问 文件需要访问系统


-1
投票

使用 InputStream 比使用 File 具有更高的内存占用

© www.soinside.com 2019 - 2024. All rights reserved.