java fileinputstream - الاختلافات بناء على كيفية الإشارة إلى كائن الملف: Classlader / FileSystem

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

سؤال

أنا استخدم أباتشي 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 تستخدم Classlader لتحديد موقع الملف. فيclasspathresource. هو فئة الربيع).

أرغب في فصل مسار الملف عن النظام. لذلك أفضل شيء مثل inputstream2 أو 3.

هل لديك أي فكرة عن سبب حدوث ذلك؟

شكرًا لك

تحديث:
حاولت الكتابة على القرص Inputstream و InputStream2.
ملف Excel الذي يأتي مع Inputstream على ما يرام. يحتوي InputStream2 على ملف Excel مع بعض الأحرف الغريبة التي تفتتح المحتوى الحقيقي.
يبدو أن مافن تفسد ملف Excel بطريقة ما أثناء الإنشاء.
لذلك هو في الأساس الملف الذي أسترده مع الفصل الدراسي (تحت /home/xxx/workspace/myproject/target/test-classes/importTest.xls) هذا ليس موافق.
اي فكرة؟

هل كانت مفيدة؟

المحلول

المشكلة تبدو مافن الفلتره اختيار.
إذا كانت بوم تبدو مثل هذا

           <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