2015-09-04 246 views
0
import java.net.URI; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileStatus; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 

public class ShowFileStatus {  
    public static void main(String[] args) throws Exception { 
     // TODO Auto-generated method stub 
     String uri = args[0]; 
     Configuration conf = new Configuration(); 
     FileSystem fs = FileSystem.get(URI.create(uri), conf); 

     Path file = new Path(args[0]); 
     FileStatus stat = fs.getFileStatus(file); 
     System.out.println(stat.getLen()); 
    } 
} 

getFileStatus()的實施是在FileSystem類和FileSystem類需要延長使用getFileStatus()方法.. 一個抽象的方法,但在上面的代碼,我可以使用方法,無需擴展FileSystem類。 如何?我無法理解這一點?抽象方法

回答

0

當您使用FileSystem類中提供的靜態工廠方法獲得FileSystem類的實例。它在內部創建一個自己實現的實例。有許多實現可用FileSystem

public static FileSystem get(URI uri, Configuration conf) throws IOException 

返回此URI的方案和授權文件系統。 URI的方案確定一個配置屬性名稱fs.scheme.class,其名稱爲FileSystem類。整個URI被傳遞給FileSystem實例的初始化方法。

現在基本上,您將調用getFileStatus方法中的一個提供的實現。

+0

但是,我們如何使用getFileStatus()方法而不定義它 – pareekrachit

+0

您錯過了Java的動態特性。實際的方法調用是根據參考運行時間決定的。這就是所謂的多元主義。看起來,您正在考慮的只是靜態(編譯時)綁定的方法,而實際調用是在運行時決定的。 – YoungHobbit