private void addNewZipEntry(ZipOutputStream zipOutputStream, Path filePath, Path fileName) throws Exception {
        Path fullPath = filePath.resolve(fileName);

        ZipEntry zipEntry = new ZipEntry(fileName.toString());
        zipOutputStream.putNextEntry(zipEntry);

//        InputStream inputStream = new FileInputStream(fullPath.toString()); // плохой вариант
        InputStream inputStream = Files.newInputStream(fullPath);             // хороший вариант
        copyData(inputStream, zipOutputStream);
        zipOutputStream.closeEntry();
    }
Чем различаются варианты создания потока? Почему плохой вариант сразу портит кучу валидаций?