Найти протокол, соответствующий 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://используйте первый метод, иначе используйте второй метод.