Объясните пожалуйста эту магию с вычитыванием в буфер, который нигде не применяется. Как jvm узнает, что можно посмотреть информацию по файлу из потока байтАрэй? Почему если не считать в в этот поток, то в считанных параметрах будет -1. В комментариях к задаче данной информации не нашел, так же как и в соседних вопросах. Неужели это действительно какая-то высокоуровневая затычка, логика которой видна только в самом низкоуровневом коде jvm?
public List<FileProperties> getFilesList() throws Exception {
        if (!Files.isRegularFile(zipFile)) throw new WrongZipFileException();
        List<FileProperties> list = new ArrayList<>();
        try (ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(zipFile))) {
            ZipEntry entry;
            while ((entry = zipInputStream.getNextEntry()) != null) {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                copyData(zipInputStream, baos);
                list.add(new FileProperties(entry.getName(), entry.getSize(),
                        entry.getCompressedSize(), entry.getMethod()));
            }
        }
        return list;
    }