Я использую 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.
Файл Excel, поставляемый с inputStream, в порядке. inputStream2 содержит файл Excel с некоторыми странными символами, которые переносят реальный контент.
Кажется, что maven каким-то образом повреждает файл Excel во время сборки.
Таким образом, это не тот файл, который я извлекаю с помощью classLoader (под /home/xxx/workspace/myproject/target/test-classes/importTest.xls
).
Есть идеи?