java FileInputStream - различия в зависимости от ссылки на объект File: classloader / filesystem - PullRequest
4 голосов
/ 10 ноября 2009

Я использую 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).
Есть идеи?

Ответы [ 2 ]

4 голосов
/ 11 ноября 2009

Кажется, проблема в фильтрации maven .
Если пом выглядит так

           <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, она повреждает их.

0 голосов
/ 11 ноября 2009

Вы пробовали ClassLoader#getResourceAsStream(String)? Вероятно, он будет вести себя так же, как ваша вторая попытка с использованием Class#getResource(String), как указано в документации последнего.

Сначала я подумал, что такой файл не найден, но если он постоянно читает одно и то же значение (-2300849302551019537) при каждом запуске программы, это говорит о том, что там действительно есть файл, который читается. Завершите оператор после инициализации InputStream и проверьте экземпляр потока в отладчике. Вы должны быть в состоянии найти ссылку на основное имя файла. Чтобы сделать это проще, попробуйте использовать ClassLoader#getResources(String) и проверьте последовательность возвращенных URL-адресов.

...