Есть ли простой, NIO2 единственный способ конвертировать URL в Path

Я хочу скопировать каталог (включая контент) с URL-адреса, полученного с

Some.class.getClassLoader().getResource("folder");

который возвращает либо jar:file:/D:/../some.jar!/someparent или же file:/D:/../someparent

Я думал о FileSystem (для jar intern dirs) и рекурсивное копирование с Files.walkFileTree(..),

Можно ли изменить jar:file:/D:/../some.jar!/folder получить FileSystem NIO2 только?

4 ответа

Решение

То, что я искал, было что-то вроде:

JarURLConnection connection = (JarURLConnection) sourceUrl
     .openConnection();

Paths.get(connection.getJarFileURL().toURI());
    URL url = new URL("file:/C:/projektoj/ĝeneralaj");
    Path path = Paths.get(url.toURI());

C:\projektoj\ĝeneralaj

Если URL указывает на jar/zip ("jar:file:/... .zip!.../..."), то можно использовать путь в файловой системе zip, см.: Java: изменить имя ZipEntry

Взгляни на:
http://docs.oracle.com/javase/tutorial/essential/io/pathClass.html

Замечание по версии: Если у вас есть код, предшествующий JDK7, который использует java.io.File, вы все равно можете воспользоваться функциональностью класса Path с помощью метода File.toPath. См. Legacy File I/O Code для получения дополнительной информации.

Отредактировано: я думаю File.toPath() метод должен быть тем, что вы хотите, он возвращает Path, в этом случае Paths.get(URI) не обязательно.

Изменить еще раз: Вы можете воспользоваться Paths.get(URL.toURI()) если вы начинаете с URL, но нужно обрабатывать URISyntaxException выбрасывается из URL.toURI().

Как упомянуто @Stephen C, Path это особенность nio2

На самом деле NIO.2 - это просто удобный ярлык для новых функций NIO, добавленных в пересмотр Java 7. Это... если вы не придавали этому термину какое-то другое значение.

Если вам нужно решение, которое не включает ничего, кроме NIO.2, то (строго говоря) это невозможно. Любое решение будет связано с использованием String, а также String предшествует NIO.2. Поэтому "не NIO.2"

Если вы хотите разрешить использование классов, которые есть в NIO.2, но не в NIO, то File не является NIO.2 или NIO. Это предшествует им обоим.


Можно ли изменить "jar:file:/D:/../some.jar!/folder" получить FileSystem NIO2 только?

Если вы спрашиваете, возможно ли создать FileSystem провайдер, который мог бы справиться с этим, в теории ответ "да", и это, вероятно, уже сделано... по модулю ограничения на то, что вы можете сделать с файлом JAR. (Обновление на месте через Path / FileSystem будет очень сложно реализовать и дорого с точки зрения ресурсов времени выполнения.)

Если вы ограничиваете вышеуказанную проблему, говоря, что для реализации провайдера и / или его использования должны использоваться только API-интерфейсы NIO.2, то ответ, вероятно, нет. (Но это зависит от того, что вы действительно подразумеваете под "только NIO.2"). "... и это зависит от того, чего вы действительно пытаетесь достичь...)

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