我有一个文本字段来从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://
有这种优雅和正确的方法吗?
答案 0 :(得分:5)
您可以查看location
是以http://
还是https://
开头:
String s = location.trim().toLowerCase();
boolean isWeb = s.startsWith("http://") || s.startsWith("https://");
或者您可以使用URI类而不是URL
,URI
不会像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不是错误,这就是事实。