找不到协议资源'在URL构造函数中

时间:2014-08-18 19:16:02

标签: java url junit protocols

我已经实现了一个类来读取RSS 2.0和Atom 1.0提要。我想写一些单元测试以验证功能。这是我的代码的提要阅读器部分:

private String readFeed(final String url) throws IOException
{
    final StringBuilder builder = new StringBuilder();
    final URL feedUrl = new URL(url);
    final BufferedReader in = new BufferedReader(
        new InputStreamReader(feedUrl.openStream()));

    String input;
    while ((input = in.readLine()) != null)
    {
        builder.append(input);
    }
    in.close();

    return builder.toString();
}

经过一些研究,我认为最好的测试方法是在我的项目资源目录中将样本提要作为XML文件。

我创建了一个示例文件“resources / rss2-0.xml”

我将以下值发送到readFeed函数“resource:///rss2-0.xml”, 我一直在接收java.net.MalformedURLException:未知协议:资源

这是我第一次使用URL路径从资源加载。据我所知,资源似乎应该是一个有效的协议。任何人都有任何想法,我可能做错了什么或其他方式来解决这个问题?

2 个答案:

答案 0 :(得分:2)

如果要使用本地文件系统处理路径,Path类最适合此任务。

  

可用于在文件系统中查找文件的对象。它会   通常表示系统相关的文件路径。

您可以像这样使用它:

Path path = FileSystems.getDefault().getPath("/resources/rss2-0.xml");
BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);

如果您真的想要处理URL,那么您正在寻找的协议就是“文件”。因此,file:///rss2-0.xml而不是resource:///rss2-0.xml甚至file:/resources/rss2-0.xml都是准确的。

请注意,在您的情况下,您确实必须迟早处理URLs,但在进行本地测试时,使用Path类将为您节省麻烦。如果您想要其他选择,请尝试URI课程。由于URI是标识符(请参阅difference between URI and URL),因此它可以标识URL或路径,可以作为最终处理URL和测试代码的生产代码之间的桥梁。可以最好地使用Path类。

例如:

public interface FeedReader {
    String readFeed(final URI uri);
}

有2个实现,一个用于本地测试:

public class LocalFeedReader implements FeedReader {

    @Override
    public String readFeed(final URI uri) {
        // URI -> Path
        // then dealing with Path to target local rss2-0.xml file
    }
}

一个用于生产代码:

public class WebFeedReader implements FeedReader {

        @Override
        public String readFeed(final URI uri) {
            // URI -> URL
            // then dealing with URL to target real resources
        }
    }

答案 1 :(得分:1)

java文档说协议处理程序的搜索路径上只保留http,https,文件和jar。其他人只能“支持”。

http://docs.oracle.com/javase/8/docs/api/java/net/URL.html#URL-java.lang.String-java.lang.String-int-java.lang.String-

如果您想要一个java发行版不支持的自定义处理程序,您将不得不创建一个。

http://mjremijan.blogspot.com/2012/02/create-your-own-java-url-handlers.html