Java的的FileInputStream - 差异基础上的文件对象是如何引用:类加载器/文件系统

StackOverflow https://stackoverflow.com/questions/1706408

我使用 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的序列返回。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top