//构造方法 public URL(URL context, String spec, URLStreamHandler handler) throws MalformedURLException //重写URLStreamHandler new URLStreamHandler(){ @Override protected URLConnection openConnection(URL u) throws IOException { return null; } } //重写URLConnection, getInputStream,getOutputStream和其余方法根据可根据实际状况决定是否重写 class TestURLConnection extends URLConnection { public TestURLConnection(URL url) { super(url); } @Override public void connect() throws IOException { } @Override public InputStream getInputStream() throws IOException { return super.getInputStream(); } @Override public OutputStream getOutputStream() throws IOException { return super.getOutputStream(); } }
new URLStreamHandlerFactory(){ @Override public URLStreamHandler createURLStreamHandler(String protocol) { return null; } } public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac) { synchronized (streamHandlerLock) { if (factory != null) { throw new Error("factory already defined"); } SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkSetFactory(); } handlers.clear(); factory = fac; } }
本质仍是使用了URLStreamHandler,可是要注意,setURLStreamHandlerFactory只可以调用一次,当工程很大,依赖不少的时候,可能会有框架中的代码先于业务代码,调用过此方法,因此为了不此种状况,最好使用方法一apache
PS:编写HDFS的大牛早就想到了,因此直接使用org.apache.hadoop.fs.FsUrlStreamHandler 便可框架