Почему чтение входного потока из zip-файла в classpath не читается должным образом в Java? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть допустимый zip-файл на моем пути к классам (Java 8).Это 302617 байт.Я хотел бы скопировать его во временную папку для расширения и дальнейшей обработки в моем приложении, используя стандартные ApacheCommons IO Utils.Если я читаю его как файл, например:

    File out = new File("out.zip");
    File in = new File ("src/main/resources/StartUpData/c4.zip");
    try (InputStream is = new FileInputStream(in);
               FileOutputStream fos = new FileOutputStream(out)   ) {
          IOUtils.copy(is, fos);
          System.out.println(out.length());
    }

, это работает точно так, как и ожидалось - распечатка 302617.

Если, однако, я читаю из входного потока classpath:

 try (InputStream is2 = this.getClass().getResourceAsStream("/StartUpData/c4.zip");         
        FileOutputStream fos = new  FileOutputStream(out)) {
        IOUtils.copy(is2, fos);
        System.out.println(out.length());
    }

генерирует файл размером 544115 байт.Это недопустимый формат zip, он не может быть распакован или прочитан как файл zip никакими утилитами zip командной строки или Java.Я наблюдаю это поведение только с zip-файлами;для других двоичных файлов или изображений оба подхода работают нормально.

Я исследовал считываемые байты в обоих случаях.Вот первые 12 байт файла из xxd -b c4.zip:

00000000: 01010000 01001011 00000011 00000100 00010100 00000000    PK....
00000006: 00001000 00001000 00001000 00000000 10111010 10011110  ......

11-й и 12-й байты в файле (10111010 10011110, hex ba 9e) читаются из входного потока classpath в виде hex ef bf.

Фактически, любой байт с первым битом, установленным в 1, неправильно читается входным потоком, созданным

this.getClass().getResourceAsStream("/StartUpData/c4.zip")

Кто-нибудь знает, почему это происходит только дляzip-файлы читаются из classpath?Как 10111010 10011110 можно интерпретировать как ef bf?Большое спасибо за любые предложения.Я использую MacOS High Sierra, мой коллега также наблюдает это поведение в Windows 10.

1 Ответ

0 голосов
/ 13 февраля 2019

Это была проблема фильтрации maven, решение см. В https://maven.apache.org/plugins/maven-resources-plugin/examples/binaries-filtering.html.Исправлено добавление zip в качестве исключения, и zip-файл может находиться в любом месте на пути к классам

...