//構造方法 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 便可框架