Поставщик не нашел исключение при создании файловой системы для моего почтового индекса?

Я создал Zip-файл на JimFS FileSystem пример. Теперь я хотел бы прочитать Zip, используя Java FileSystem API.

Вот как я создаю FileSystem:

final FileSystem zipFs = FileSystems.newFileSystem(
    source, // source is a Path tied to my JimFS FileSystem
    null);

Тем не менее, это выдает ошибку:

java.nio.file.ProviderNotFoundException: поставщик не найден

Интересно, что код работает по умолчанию FileSystem,

  • Что означает эта ошибка?
  • Как мне создать мой Zip FileSystem?

3 ответа

Это не поддерживается до JDK 12 через этот конкретный конструктор ( Path, ClassLoader)

Это было исправлено в JDK12 с фиксацией 196c20c0d14d99cc08fae64a74c802b061231a41.

Код нарушения находился в ZipFileSystemProvider в JDK 11 и более ранних версиях:

              if (path.getFileSystem() != FileSystems.getDefault()) {
            throw new UnsupportedOperationException();
        }

Это работает, но кажется хакерским, и что принципиально, я не уверен, почему это работает.

public static FileSystem fileSystemForZip(final Path pathToZip) {
    Objects.requireNotNull(pathToZip, "pathToZip is null");
    try {
        return FileSystems.getFileSystem(pathToZipFile.toUri());
    } catch (Exception e) {
        try {
            return FileSystems.getFileSystem(URI.create("jar:" + pathToZipFile.toUri()));
        } catch (Exception e2) {
            return FileSystems.newFileSystem(
                URI.create("jar:" + pathToZipFile.toUri()), 
                new HashMap<>());
        }
    }
}

Проверьте, sourceпуть указывает на файл zip-архива.

В моем случае это указывало на обычный текстовый файл, который даже имел расширение, отличное от «.zip».

Другие вопросы по тегам