У меня есть допустимый 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.