Есть ли простой, 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"). "... и это зависит от того, чего вы действительно пытаетесь достичь...)