Java FileInputStream vs ClassPathResource vs getResourceAsStream和文件完整性

Java FileInputStream vs ClassPathResource vs getResourceAsStream和文件完整性,java,stream,apache-poi,Java,Stream,Apache Poi,我有一个奇怪的问题: 在src/main/resources中,我有一个“template.xlsx”文件 如果我这样做: InputStream is = new ClassPathResource("template.xlsx").getInputStream(); 或者这个: InputStream is = ClassLoader.getSystemResourceAsStream("template.xlsx"); InputStream is = getClass().getRe

我有一个奇怪的问题:

在src/main/resources中,我有一个“template.xlsx”文件

如果我这样做:

InputStream is = new ClassPathResource("template.xlsx").getInputStream();
或者这个:

InputStream is = ClassLoader.getSystemResourceAsStream("template.xlsx");
InputStream is = getClass().getResourceAsStream("/template.xlsx");
或者这个:

InputStream is = ClassLoader.getSystemResourceAsStream("template.xlsx");
InputStream is = getClass().getResourceAsStream("/template.xlsx");
当我尝试创建工作簿时:

Workbook wb = new XSSFWorkbook(is);
我得到这个错误:

java.util.zip.ZipException: invalid block type
但是,当我得到这样的文件时:

InputStream is = new FileInputStream("C:/.../src/main/resources/template.xlsx");
它起作用了

怎么了?我无法硬编码文件的完整路径

有人能帮我吗


谢谢

你没有试着像这样访问它吗

InputStream is = new FileInputStream("/main/resources/template.xlsx");

我也有同样的问题,您可能在maven过滤方面有问题

此代码从源代码加载文件,未经筛选

InputStream is = new FileInputStream("C:/.../src/main/resources/template.xlsx");
这段代码在maven过滤完内容后从目标目录加载文件

InputStream is = getClass().getResourceAsStream("/template.xlsx");

您不应筛选excel之类的二进制文件,而应使用本页底部所述的两个互斥资源集

您能否确保从类路径加载时完全确定加载的是哪个版本的
template.xlsx
getResourceAsStream()
(等等)可以从许多地方加载资源。对于文件名,您完全可以确定加载的是什么。这是由于maven过滤,而不是用于加载流的方法!谢谢:)非常感谢您的回答,我在这个问题上花了这么多时间((如何从过滤中排除: