URL URI File Path 转换(原创)

File to URI:     
          File file = ...;
          URI uri = file.toURI();


File to URL:     
          File file = ...;
          URL url = file.toURI().URL();


URL to File:     
          URL url = ...;
          File file = new Path(url.getPath()).toFile();


URI to URL:     
          URI uri = ...;
          URL url = uri.toURL();


URL to URI:     
          URL url = ...;
          URI uri = url.toURI();


一般情况下采用上述方式都可以安全的使用.


但是, 当处理本地路径且有空格,或者特殊字符,比如汉字等. 路径在相互的转换过程中, 可能会出现转换的无效字符错误异常.
所以, 可以使用Eclipse提供的工具类org.eclipse.core.runtime.URIUtil (插件: org.eclipse.equinox.simpleconfigurator)来进行转换.
URL <wbr>URI <wbr>File <wbr>Path <wbr>转换(原创)


比如URL to File:   
          URL url = ...;
          File file = URIUtil.toFile(URIUtil.toURI(url));


当URL, URI直接互相转换时,也可以使用该URIUtil工具类.
toURI
toURL


还有一个工具类,就是org.eclipse.core.runtime.FileLocator(插件: org.eclipse.equinox.common) 也可以对URL进行File的格式化. 比如toFileURL方法.




附源码:
 
package org.eclipse.equinox.internal.simpleconfigurator.utils;


import java.io.File;
import java.net.*;




public class URIUtil {


    private static final String SCHEME_FILE = "file"; //$NON-NLS-1$
    private static final String UNC_PREFIX = "//"; //$NON-NLS-1$


   
    public static URI append(URI base, String extension) {
        try {
            String path = base.getPath();
            if (path == null)
                return appendOpaque(base, extension);
            //if the base is already a directory then resolve will just do the right thing
            if (path.endsWith("/")) {//$NON-NLS-1$
                URI result = base.resolve(extension);
                //Fix UNC paths that are incorrectly normalized by URI#resolve (see Java bug 4723726)
                String resultPath = result.getPath();
                if (path.startsWith(UNC_PREFIX) && (resultPath == null || !resultPath.startsWith(UNC_PREFIX)))
                    result = new URI(result.getScheme(), "///" + result.getSchemeSpecificPart(), result.getFragment()); //$NON-NLS-1$
                return result;
            }
            path = path + "/" + extension; //$NON-NLS-1$
            return new URI(base.getScheme(), base.getUserInfo(), base.getHost(), base.getPort(), path, base.getQuery(), base.getFragment());
        } catch (URISyntaxException e) {
            //shouldn't happen because we started from a valid URI
            throw new RuntimeException(e);
        }
    }


   
    private static URI appendOpaque(URI base, String extension) throws URISyntaxException {
        String ssp = base.getSchemeSpecificPart();
        if (ssp.endsWith("/")) //$NON-NLS-1$
            ssp += extension;
        else
            ssp = ssp + "/" + extension; //$NON-NLS-1$
        return new URI(base.getScheme(), ssp, base.getFragment());
    }


   
    public static URI fromString(String uriString) throws URISyntaxException {
        int colon = uriString.indexOf(':');
        int hash = uriString.lastIndexOf('#');
        boolean noHash = hash < 0;
        if (noHash)
            hash = uriString.length();
        String scheme = colon < 0 ? null : uriString.substring(0, colon);
        String ssp = uriString.substring(colon + 1, hash);
        String fragment = noHash ? null : uriString.substring(hash + 1);
        //use java.io.File for constructing file: URIs
        if (scheme != null && scheme.equals(SCHEME_FILE)) {
            File file = new File(uriString.substring(5));
            if (file.isAbsolute())
                return file.toURI();
            scheme = null;
            if (File.separatorChar != '/')
                ssp = ssp.replace(File.separatorChar, '/');
        }
        return new URI(scheme, ssp, fragment);
    }


   
    public static boolean sameURI(URI url1, URI url2) {
        if (url1 == url2)
            return true;
        if (url1 == null || url2 == null)
            return false;
        if (url1.equals(url2))
            return true;


        if (url1.isAbsolute() != url2.isAbsolute())
            return false;


        // check if we have two local file references that are case variants
        File file1 = toFile(url1);
        return file1 == null ? false : file1.equals(toFile(url2));
    }


   
    public static File toFile(URI uri) {
        try {
            if (!SCHEME_FILE.equalsIgnoreCase(uri.getScheme()))
                return null;
            //assume all illegal characters have been properly encoded, so use URI class to unencode
            return new File(uri);
        } catch (IllegalArgumentException e) {
            //File constructor does not support non-hierarchical URI
            String path = uri.getPath();
            //path is null for non-hierarchical URI such as file:c:/tmp
            if (path == null)
                path = uri.getSchemeSpecificPart();
            return new File(path);
        }
    }


   
    public static String toUnencodedString(URI uri) {
        StringBuffer result = new StringBuffer();
        String scheme = uri.getScheme();
        if (scheme != null)
            result.append(scheme).append(':');
        //there is always a ssp
        result.append(uri.getSchemeSpecificPart());
        String fragment = uri.getFragment();
        if (fragment != null)
            result.append('#').append(fragment);
        return result.toString();
    }


   
    public static URI toURI(URL url) throws URISyntaxException {
        //URL behaves differently across platforms so for file: URLs we parse from string form
        if (SCHEME_FILE.equals(url.getProtocol())) {
            String pathString = url.toExternalForm().substring(5);
            //ensure there is a leading slash to handle common malformed URLs such as file:c:/tmp
            if (pathString.indexOf('/') != 0)
                pathString = '/' + pathString;
            else if (pathString.startsWith(UNC_PREFIX) && !pathString.startsWith(UNC_PREFIX, 2)) {
                //URL encodes UNC path with two slashes, but URI uses four (see bug 207103)
                pathString = UNC_PREFIX + pathString;
            }
            return new URI(SCHEME_FILE, null, pathString, null);
        }
        try {
            return new URI(url.toExternalForm());
        } catch (URISyntaxException e) {
            //try multi-argument URI constructor to perform encoding
            return new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
        }
    }


   
    public static URL toURL(URI uri) throws MalformedURLException {
        return new URL(uri.toString());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值