今天看了一個文件管理的java後臺源碼,elfinderjava
發現這個東東比我寫的代碼效率告到不知道哪去了,苦思冥想後仍是抽點時間看看吧。。git
它實現了咱們電腦上的因此關於文件操做的動做,並生成了api開放給前臺,具體詳細仍是看官方文檔吧,本人英文賊菜github
之間用了Java1.7中的NIO裏的path類,此工具類能夠使咱們不在使用噁心的FIle對象啦,並且速度超快,看着代碼整我的都舒服這裏有它的介紹JAVA NIO:Path ,Filespring
項目地址elfinder-java-connector此版本沒有前臺頁面實現設計模式
此版本有前臺實現elfinder-2.x-servlet不過此版本沒有Java源碼,是經過maven導入的方式讓咱們調用它的核心類api
兩種相差spring集成、加載配置文件到context的實現app
相差補充:elfinder-java-connector主要介紹源碼的梗概maven
elfinder-2.x-servlet介紹了這個核心類的包裝,多了用戶視圖,操做權限等一些附加模塊ide
我今天看的是前者的代碼工具
首先咱們先從底層看齊
今天稍微看了一個大概
首先定義了一個公共的接口向外部開放,因此的規則依據此接口開發
public interface Volume{
各類須要操做文件的定義
String getMimeType(Target target) throws IOException;
} 合成這個接口的包裝接口(設計模式中合成) public interface Target { Volume getVolume(); }
好了以後實現了這個包裝接口Target
public class NIO2FileSystemTarget implements Target { private final Path path; private final Volume volume; 。。。。。。。。。。。。。。。。。。。
再而後聚合了這個幾個接口和實現類
public class NIO2FileSystemVolume implements Volume { private final String alias; private final Path rootDir; private final Detector detector; private NIO2FileSystemVolume(Builder builder) { this.alias = builder.alias; this.rootDir = builder.rootDir; this.detector = new NIO2FileTypeDetector();//我今天大體弄明白了這個的實現 createRootDir(); }
@Override
public String getMimeType(Target target) throws IOException {
Path path = fromTarget(target);
return detector.detect(path);
}
。。。。。。。。。。。。。。。。。。。。。。
咱們從這個聚合類開始看
下面這個獲取文件類型的實現是經過tika的工具獲取的 文件內容讀取--Tika這個介紹比較詳細
Tika是Apache下開源的文檔內容解析工具,支持上千種文檔格式(如PPT、XLS、PDF)。Tika使用統一的方法對各類類型文件進行內容解析,封裝了各類格式解析的內部實現,可用於搜索引擎索引、內容分析、轉換等場景。
咱們來看他的具體實現
首先是Detector 他的一個接口
public interface Detector { String detect(InputStream inputStream)throws IOException; String detect(Path path)throws IOException; }
實現
public class NIO2DileTypeDetector implements Detector { private final Tika tika = new Tika(); 。。。。。。。。。。。。。。。。。。。。。
看了這些大概弄明白這個代碼的大體寫法內心有點小激動,咱們寫個測試類
public class Test { @org.junit.Test public void Test1()throws IOException { Path path = Paths.get("F:\\[加密與解密(第三版)].段鋼.掃描版.pdf"); NIO2DileTypeDetector detector = new NIO2DileTypeDetector(); System.out.println(detector.detect(path)); } }
C:\server\jdk1.8.0_77\bin\java 。。。。。。。。。。application/pdf