Tag: classloader

java FileInputStream – 基于如何引用File对象的差异:classloader / filesystem

我正在使用Apache POI从Excel文件中提取一些数据。 我需要一个InputStream来实例化POI HSSFWorkbook类 HSSFWorkbook wb = new HSSFWorkbook(inputStreamX); 如果我尝试构buildInputStream对象,我发现差异 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(); 如果我用inputStream构造POI对象,它工作正常。 但是inputStream2和inputStream3抛出这个exception 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类)。 我想将文件path从系统中分离出来。 所以我更喜欢像inputStream2或3。 你有什么想法,为什么发生这种情况? 谢谢 更新: 我试图写入磁盘的inputStream和inputStream2。 inputStream附带的excel文件是OK的。 inputStream2包含一个包含真实内容的奇怪字符的Excel文件。 maven似乎在构build过程中以某种方式破坏了excel文件。 所以它基本上是我用classLoader(在/home/xxx/workspace/myproject/target/test-classes/importTest.xls下)检索的文件不正确。 […]