Как получить только jar-адрес из jar: URL-адрес, содержащий "!" и конкретный файл в банке?
Я получаю URL-адрес jar файла во время выполнения:
jar:file:///C:/proj/parser/jar/parser.jar!/test.xml
Как это можно преобразовать в допустимый путь как:
C:/proj/parser/jar/parser.jar.
Я уже пробовал использовать File(URI)
, getPath()
, getFile()
напрасно.
Ответы
Ответ 1
Это может произойти, если MS-Windows не оскорблена ведущей косой чертой:
final URL jarUrl =
new URL("jar:file:/C:/proj/parser/jar/parser.jar!/test.xml");
final JarURLConnection connection =
(JarURLConnection) jarUrl.openConnection();
final URL url = connection.getJarFileURL();
System.out.println(url.getFile());
Ответ 2
Не уверен в точном методе, который даст вам то, что вы хотите, но это должно вас закрыть:
import static org.junit.Assert.assertEquals;
import java.net.URL;
import org.junit.Test;
public class UrlTest {
@Test
public void testUrl() throws Exception {
URL jarUrl = new URL("jar:file:/C:/proj/parser/jar/parser.jar!/test.xml");
assertEquals("jar", jarUrl.getProtocol());
assertEquals("file:/C:/proj/parser/jar/parser.jar!/test.xml", jarUrl.getFile());
URL fileUrl = new URL(jarUrl.getFile());
assertEquals("file", fileUrl.getProtocol());
assertEquals("/C:/proj/parser/jar/parser.jar!/test.xml", fileUrl.getFile());
String[] parts = fileUrl.getFile().split("!");
assertEquals("/C:/proj/parser/jar/parser.jar", parts[0]);
}
}
Надеюсь, что это поможет.
Ответ 3
Некоторые могут подумать, что это немного "взломанный", но он выполнит задание в этом экземпляре, и я уверен, что он будет выполнять чертовски зрелище лучше, чем создавать все эти объекты в других предложениях.
String jarUrl = "jar:file:/C:/proj/parser/jar/parser.jar!/test.xml";
jarUrl = jarUrl.substring(jarUrl.indexOf('/')+1, jarUrl.indexOf('!'));
Ответ 4
Это решение будет обрабатывать пробелы в пути.
String url = "jar:file:/C:/dir%20with%20spaces/myjar.jar!/resource";
String fileUrl = url.substring(4, url.indexOf('!'));
File file = new File(new URL(fileUrl).toURI());
String fileSystemPath = file.getPath();
или с объектом URL для начала:
...
String fileUrl = url.getPath().substring(0, url.indexOf('!'));
...
Ответ 5
Мне просто нужно было это сделать.
URL url = clazz.getResource(clazz.getSimpleName() + ".class");
String proto = url.getProtocol();
boolean isJar = proto.equals("jar"); // see if it in a jar file URL
if(isJar)
{
url = new URL(url.getPath()); // this nicely strips off the leading jar:
proto = url.getProtocol();
}
if(proto.equals("file"))
{
if(isJar)
// you can truncate it at the last '!' here
}
else if(proto == "http") {
...
Ответ 6
//This code will work on both Windows and Linux
public String path()
{
URL url1 = getClass().getResource("");
String urs=url1.toString();
urs=urs.substring(9);
String truepath[]=urs.split("parser.jar!");
truepath[0]=truepath[0]+"parser.jar";
truepath[0]=truepath[0].replaceAll("%20"," ");
return truepath[0];
}
Ответ 7
Вы можете сделать это. Эти работы
ClassLoader loader = this.getClass().getClassLoader();
URL url = loader.getResource("resource name");
String[] filePath = null;
String protocol = url.getProtocol();
if(protocol.equals("jar")){
url = new URL(url.getPath());
protocol = url.getProtocol();
}
if(protocol.equals("file")){
String[] pathArray = url.getPath().split("!");
filePath = pathArray[0].split("/",2);
}
return filePath[1];