Найти протокол, соответствующий URI в Java
У меня есть объект URI в Java. Я хочу преобразовать его в InputStream, но преобразование должно зависеть от протокола. Я могу сделать это, если мой URI http://somepath.com/mysuperfile.xsl
:
return myURI.toURL().openConnection().getInputStream();
или, если мой uri file:///somepath/mysuperfile.xsl
:
return new FileInputStream(Paths.get(myURI).toFile());
или, может быть, даже каким-то другим способом. Я могу попытаться проверить его вручную, но у Java есть хороший/правильный способ проверить его, возможно, используя этот новый пакет java.nio.*
?
Ответы
Ответ 1
Каждый URI определяется как состоящий из четырех частей:
[scheme name] : [hierarchical part] [[ ? query ]] [[ # fragment ]]
Если вы хотите указать название схемы (что примерно соответствует протоколу), просто используйте
switch ( myURI.getScheme() ) {
case "http":
return myURI.toURL().openConnection().getInputStream();
case "ftp":
// do something
case "file":
return new FileInputStream( Paths.get(myURI).toFile() );
}
http://docs.oracle.com/javase/6/docs/api/java/net/URI.html#getScheme%28%29
или, если вы просто хотите сгенерировать InputStream
без различия схемы, просто используйте
return myURI.toURL().openStream();
или
return myURI.toURL().openConnection().getInputStream();
(как вы уже делали для протокола HTTP/схемы)
Ответ 2
Нет необходимости в специальных URI файла case. Тот же код работает для обоих случаев. Я просто протестировал его с помощью следующей маленькой программы:
URIReadTest.java
import java.io.*;
import java.net.*;
public class URIReadTest {
public static void main(String[] args) throws Exception {
URI uri = new URI("file:///tmp/test.txt");
InputStream in = uri.toURL().openConnection().getInputStream();
// or, more concisely:
// InputStream in = uri.toURL().openStream();
int b;
while((b = in.read()) != -1) {
System.out.print((char) b);
}
in.close();
}
}
Сделайте /tmp/test.txt
в вашей системе, и вы увидите, что содержимое распечатывается при компиляции и запуске вышеуказанного кода.
Ответ 3
вы можете проверить символы в начале строки с помощью функции startWith (String prefix), это www. или http://используйте первый метод, иначе используйте второй метод.