Java 如何获取URL的路径

Java 如何获取URL的路径,java,url,uri,Java,Url,Uri,有一个URL,如何检索其路径部分 如何获取“test1/test2”您想要这样的东西: String path = new URL("http://www.costo.com/test1/test2").getPath(); 实际上,这将为您提供/test1/test2。您只需删除第一个/,即可获得所需: path = path.replaceFirst("/", ""); 现在,您将在路径中设置test1/test2 URL url = new URL("http://www.goo

有一个URL,如何检索其路径部分


如何获取“test1/test2”

您想要这样的东西:

String path = new URL("http://www.costo.com/test1/test2").getPath();
实际上,这将为您提供
/test1/test2
。您只需删除第一个
/
,即可获得所需:

path = path.replaceFirst("/", "");
现在,您将在
路径中设置
test1/test2

 URL url = new  URL("http://www.google.com/in/on");
 System.out.println(url.getPath());
另请参见

使用类的
URL.getPath()
方法。

您可以执行以下操作:

    URL url = new URL("http://www.costo.com/test1/test2");
    System.out.println(url.getPath());

我对使用JavaURL类仅仅从URL中提取路径的性能表示怀疑,并认为这是一种过激行为

因此,我编写了三种方法,它们都使用不同的方法从给定URL提取路径

  • 第一个方法使用JavaURL类中的URL.getPath方法
  • 第二种方法使用我在SO中找到的regex(我丢失了源链接,否则我会在这里给作者评分)
  • 第三种方法使用数组拆分和联接来获得相同的结果
  • 对于给定的URL,这三个方法都被调用1000000次

    结果是:

    #1 (getPathviaURL)   took:    860ms
    #2 (getPathViaRegex) took:   3763ms
    #3 (getPathViaSplit) took:   1365ms
    
    代码-可以随意优化它:

    public static void main(String[] args) {
    
    
            String host = "http://stackoverflow.com/questions/5564998/how-to-get-the-path-of-a-url";
    
            long start1 = System.currentTimeMillis();
            int i = 0;
            while (i < 1000000) {
                getPathviaURL(host);
                i++;
            }
            long end1 = System.currentTimeMillis();
    
            System.out.println("#1 (getPathviaURL) took: " + (end1 - start1) + "ms");
            Pattern p = Pattern.compile("(?:([^:\\/?#]+):)?(?:\\/\\/([^\\/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?");
    
            long start2 = System.currentTimeMillis();
            int i2 = 0;
            while (i2 < 1000000) {
                getPathViaRegex(host, p);
                i2++;
            }
            long end2 = System.currentTimeMillis();
            System.out.println("#2 (getPathViaRegex) Took: " + (end2 - start2) + "ms");
    
            long start3 = System.currentTimeMillis();
            int i3 = 0;
            while (i3 < 1000000) {
                getPathViaSplit(host);
                i3++;
            }
            long end3 = System.currentTimeMillis();
            System.out.println("#3 (getPathViaSplit) took: " + (end3 - start3) + "ms");
    
    
    
        }
    
        public static String getPathviaURL(String url) {
            String path = null;
            try {
                path = new URL(url).getPath();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return path;
        }
    
        public static String getPathViaRegex(String url, Pattern p) {
            Matcher m = p.matcher(url);
    
            if (m.find()) {
                return m.group(3);
            }
            return null;
        }
    
        public static String getPathViaSplit(String url) {
            String[] parts = url.split("/");
    
            parts = Arrays.copyOfRange(parts, 3, parts.length);
            String joined = "/" + StringUtils.join(parts, "/");
    
            return joined;
        }
    
    publicstaticvoidmain(字符串[]args){
    字符串主机=”http://stackoverflow.com/questions/5564998/how-to-get-the-path-of-a-url";
    long start1=System.currentTimeMillis();
    int i=0;
    而(i<1000000){
    getPathviaURL(主机);
    i++;
    }
    long-end1=System.currentTimeMillis();
    println(“#1(getPathviaURL)取“+(end1-start1)+”ms”);
    模式p=Pattern.compile(((?:([^:\/?\/?\]+):)(?:\/\\/([^\\/?\]*))([^?\\]*)(?:\?([^ \]*))(?:\?([^ \]*)(?:\(*)(?:。);
    long start2=System.currentTimeMillis();
    int i2=0;
    而(i2<1000000){
    getPathViaRegex(主机,p);
    i2++;
    }
    long-end2=System.currentTimeMillis();
    System.out.println(“#2(getPathViaRegex)取“+(end2-start2)+”ms”);
    long start3=System.currentTimeMillis();
    int i3=0;
    而(i3<1000000){
    getPathViaSplit(主机);
    i3++;
    }
    long-end3=System.currentTimeMillis();
    System.out.println(“#3(getPathViaSplit)取“+(end3-start3)+”ms”);
    }
    公共静态字符串getPathviaURL(字符串url){
    字符串路径=null;
    试一试{
    路径=新URL(URL).getPath();
    }捕获(格式错误){
    //TODO自动生成的捕捉块
    e、 printStackTrace();
    }
    返回路径;
    }
    公共静态字符串getPathViaRegex(字符串url,模式p){
    Matcher m=p.Matcher(url);
    if(m.find()){
    返回m组(3);
    }
    返回null;
    }
    公共静态字符串getPathViaSplit(字符串url){
    String[]parts=url.split(“/”);
    parts=Arrays.copyOfRange(parts,3,parts.length);
    字符串连接=“/”+StringUtils.join(部分“/”);
    回归加入;
    }
    
    如果您想从应用程序的url获取它,例如。 使用可以使用

    request.getRequestURI() //result will be like test1/test2
    

    如果有人在尝试后觉得自己很笨,请注意,这不是javascript代码。不要使用
    System.currentTimeMillis()
    进行微观基准测试。使用纳米,这是更准确的。请记住,这不是一个真正的基准,我强烈建议为此使用基准工具,更重要的是,不要过早地进行优化。我无法想象这是应用程序中的瓶颈:-)