FileInputStream vs ClassPathResource vs getResourceAsStream和文件完整性

时间:2012-03-23 14:09:18

标签: 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().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");

有效!

有什么问题?我无法将完整路径硬编码到文件中。

有人可以帮我这个吗?

由于

2 个答案:

答案 0 :(得分:19)

我有同样的问题,你可能有maven过滤问题。

此代码从源代码加载文件,未经过滤

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

此代码在maven过滤内容

后从目标目录加载文件
InputStream is = getClass().getResourceAsStream("/template.xlsx");

您不应过滤像excel这样的二进制文件,并使用两个互斥的资源集,如本页底部所述maven resources plugin

答案 1 :(得分:0)

你有没有尝试像

那样访问它
InputStream is = new FileInputStream("/main/resources/template.xlsx");