Java的的FileInputStream - 差异基础上的文件对象是如何引用:类加载器/文件系统
-
19-09-2019 - |
题
我使用 apache的POI 以提取excel文件的某些数据。结果
我需要一个InputStream实例的POI HSSFWorkbook类结果HSSFWorkbook wb = new HSSFWorkbook(inputStreamX);
结果
点击
我发现差异,如果我尝试构建像InputStream对象
InputStream inputStream = new FileInputStream(new File("/home/xxx/workspace/myproject/test/resources/importTest.xls"));
InputStream inputStream2 = new FileInputStream(getClass().getResource("/importTest.xls").getFile());
InputStream inputStream3 = new ClassPathResource("importTest.xls").getInputStream();
如果我构造POI对象随同InputStream它工作正常。结果 但inputStream2和inputStream3扔这个异常点击
java.io.IOException: Invalid header signature; read -2300849302551019537, expected -2226271756974174256
at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:100)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:84)
看来,二进制文件的报头是不同的,并且该库不能识别它为Excel文件。我不明白为什么。结果 我看到的唯一区别是,inputStream2和3所使用的类加载器来查找文件。 (使用ClassPathResource 是一个Spring类)。
我想有从系统中分离的文件路径。所以,我宁愿像inputStream2或3。
你有没有关于为什么发生这种情况的任何想法?
感谢您
<强>更新强>结果
我试图写入磁盘的InputStream和inputStream2。点击自带的InputStream为好Excel文件。 inputStream2包含带有包装的实际内容的一些奇怪的字符的Excel文件。点击
看来,Maven的破坏在构建过程中的一些方式Excel文件。点击
所以基本上我的类加载器(下/home/xxx/workspace/myproject/target/test-classes/importTest.xls
)来检索文件,是不正常。结果
任何想法?
解决方案
这个问题似乎行家的滤波选项。<无线电通信>如果POM看起来像这样,点击
<testResource>
<directory>${basedir}/src/test/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.sql</include>
<include>**/*.xls</include>
</includes>
<filtering>true</filtering>
</testResource>
当过滤选项被设置为true XLS文件它破坏它们。结果
其他提示
您是否尝试过的 ClassLoader#getResourceAsStream(String)
?它可能会表现类似于你的第二次尝试使用的 Class#getResource(String)
,因为后者的文档中提到的。
我在这里的第一个念头是没有这样的文件被发现,但如果它持续读取相同的值(-2300849302551019537
)每次运行程序的时候,也意味着真的是有多数民众赞成被读取的文件。陷阱后,您的发言初始化InputStream
并在调试检查流实例。你应该能够找到底层文件名的引用。为了使起初这更容易,请尝试使用的 ClassLoader#getResources(String)
和检查URL的序列返回。