如何知道字符串路径是Web URL还是基于文件

时间:2014-08-11 07:14:49

标签: java file url

我有一个文本字段来从User获取位置信息(字符串类型)。它可以是基于文件目录(例如C:\directory)或Web URL(例如http://localhost:8008/resouces)。系统将从该位置读取一些预定的元数据文件。

给定输入字符串,我如何有效地检测路径位置的性质,无论是基于文件还是Web URL。

到目前为止,我已经尝试过了。

URL url = new URL(location); // will get MalformedURLException if it is a file based.
url.getProtocol().equalsIgnoreCase("http");

File file = new File(location); // will not hit exception if it is a url.
file.exist(); // return false if it is a url.

我仍在努力寻找解决这两种情况的最佳方法。 : - (

基本上我不希望使用前缀显式检查路径,例如http://https://

有这种优雅和正确的方法吗?

4 个答案:

答案 0 :(得分:5)

您可以查看location是以http://还是https://开头:

String s = location.trim().toLowerCase();
boolean isWeb = s.startsWith("http://") || s.startsWith("https://");

或者您可以使用URI类而不是URLURI不会像MalformedURLException类那样抛出URL

URI u = new URI(location);
boolean isWeb = "http".equalsIgnoreCase(u.getScheme())
    || "https".equalsIgnoreCase(u.getScheme())

如果您在位置使用反斜杠,new URI()也可能会抛出URISyntaxException。最好的方法是使用前缀检查(我的第一个建议)或创建一个URL并捕获MalformedURLException,如果抛出你将知道它不能是一个有效的网址。

答案 1 :(得分:1)

你可以尝试:

static public boolean isValidURL(String urlStr) {
    try {
      URI uri = new URI(urlStr);
      return uri.getScheme().equals("http") || uri.getScheme().equals("https");
    }
    catch (Exception e) {
        return false;
    }
}

请注意,对于使网址无效的任何其他原因,或者非http / https网址,这将返回false:格式错误的网址不一定是实际的文件名,而良好的文件名可能指的是非现有文件名,所以将它与你的文件存在检查结合使用。

答案 2 :(得分:1)

如果你开始使用try / catch场景"优雅",这里有一种更具体的方式:

try {
    processURL(new URL(location));
}
catch (MalformedURLException ex){
    File file = new File(location);
    if (file.exists()) {
        processFile(file);
    }
    else {
        throw new PersonalException("Can't find the file");
    }
}

这样,您就会获得自动URL语法检查,并且检查文件是否存在失败。

答案 3 :(得分:0)

public boolean urlIsFile(String input) {
    if (input.startsWith("file:")) return true;
    try { return new File(input).exists(); } catch (Exception e) {return false;}
}

这是最好的方法,因为它没有麻烦,如果您有文件引用,它将始终返回true。例如,其他解决方案并不能涵盖可用的多种协议方案,例如ftp,sftp,scp或任何未来的协议实现。所以这个是用于所有用途和目的的那个;如果它不以文件协议开头,则必须存在文件的警告。

如果按照它的名称查看函数的逻辑,你应该明白,对于不存在的直接路径查找返回false不是错误,这就是事实。