Java-I/O系統(tǒng)

對程序語言的設(shè)計者來說施流,創(chuàng)建一個好的輸出/輸入(I/O)系統(tǒng)是一項艱難的任務(wù)鄙信。——《Thinking in Java》

18.1 File類

18.1.1 目錄列表器

Directory.java

package com.ntech.io;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;

/**
 * 目錄實用工具類
 * @author joiant
 *
 */
public final class Directory {

    public static void main(String[] args) {
        System.out.println(walk("."));

    }

    /**
     * 根據(jù)正則表達(dá)式匹配文件,獲得File數(shù)組
     * @param dir
     * @param regex
     * @return
     */
    public static File[] local(File dir, final String regex) {
        return dir.listFiles(new FilenameFilter() {
            private Pattern pattern = Pattern.compile(regex);
            @Override
            public boolean accept(File dir, String name) {
                // TODO Auto-generated method stub
                return pattern.matcher(new File(name).getName()).matches();
            }
            
        });
    }
    
    /**
     * Overloaded
     * @param path
     * @param regex
     * @return
     */
    public static File[] local(String path, final String regex) {
        return local(new File(path), regex);
    }
    
    /**
     * 實現(xiàn)了Iterable<File>
     * @author joiant
     *
     */
    public static class TreeInfo implements Iterable<File>{
        public List<File> files = new ArrayList<File>();
        public List<File> dirs = new ArrayList<File>();
        @Override
        public Iterator<File> iterator() {
            // TODO Auto-generated method stub
            return files.iterator();
        }
        
        void addAll(TreeInfo other) {
            files.addAll(other.files);
            dirs.addAll(other.dirs);
        }
        
        public String toString() {
            return "dirs: " + PPrint.pformat(dirs) + "\n\n" 
                    + "files: " + PPrint.pformat(files);
        }   
    }
    
    /**
     * 將目錄名字轉(zhuǎn)化為File對象
     * @param start
     * @param regex
     * @return
     */
    public static TreeInfo walk(String start, String regex) {
        return recurseDirs(new File(start), regex);
    }
    
    public static TreeInfo walk(File start, String regex) {
        return recurseDirs(start, regex);
    }
    
    public static TreeInfo walk(String start) {
        return recurseDirs(new File(start), ".*");
    }
    
    static TreeInfo recurseDirs(File startDir, String regex) {
        TreeInfo result = new TreeInfo();
        for(File item : startDir.listFiles()) {
            if(item.isDirectory()) {
                result.dirs.add(item);
                result.addAll(recurseDirs(item, regex));
            }else if(item.getName().matches(regex)) {
                result.files.add(item);
            }
        }
        return result;
    }
}

PPrint.java

package com.ntech.io;

import java.util.Arrays;
import java.util.Collection;

/**
 * "靈巧打印機(jī)"
 * @author joiant
 *
 */
public class PPrint {
    public static String pformat(Collection<?> c) {
        if(c.size() == 0) {
            return "[]";
        }
        StringBuilder result = new StringBuilder("[");
        for(Object elem : c) {
            if(c.size() != 1) {
                result.append("\n  ");
            }
            result.append(elem);
        }
        if(c.size() != 1) {
            result.append("\n");
        }
        result.append("]");
        return result.toString();
    }
    
    public static void pprint(Collection<?> c) {
        System.out.println(pformat(c));
    }
    
    public static void pprint(Object[] c) {
        System.out.println(pformat(Arrays.asList(c)));
    }
}

ProcessFiles.java

package com.ntech.io;

import java.io.File;
import java.io.IOException;

public class ProcessFiles {
    public interface Strategy{
        void process(File file);
    }
    
    private Strategy strategy;
    private String ext;
    public ProcessFiles(Strategy strategy, String ext) {
        this.strategy = strategy;
        this.ext = ext;
    }
    
    public void start(String[] args) throws IOException {
        if(args.length ==0) {
            processDirectoryTree(new File("."));
        }else {
            for(String arg: args) {
                File fileArg = new File(arg);
                if(fileArg.isDirectory()) {
                    processDirectoryTree(fileArg);
                }else {
                    if(!arg.endsWith("." + ext)) {
                        arg += "." + ext;
                    }
                    strategy.process(new File(arg).getCanonicalFile());
                }
            }
        }
    }
    
    public void processDirectoryTree(File root) throws IOException {
        for(File file:Directory.walk(root.getAbsolutePath(), ".*\\." + ext)) {
            strategy.process(file.getCanonicalFile());
        }
    }
    
    public static void main(String[] args) throws IOException {
        new ProcessFiles(new Strategy() {
            
            @Override
            public void process(File file) {
                System.out.println(file);
                
            }
        }, "java").start(args);
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚓土,一起剝皮案震驚了整個濱河市赖淤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌确丢,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲜侥,死亡現(xiàn)場離奇詭異诸典,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狐粱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門肌蜻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒋搜,你說我怎么就攤上這事判莉∮” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵渗饮,是天一觀的道長宿刮。 經(jīng)常有香客問我,道長僵缺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任翠胰,我火速辦了婚禮,結(jié)果婚禮上之景,老公的妹妹穿的比我還像新娘膏潮。我一直安慰自己,他們只是感情好焕参,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刻帚,像睡著了一般涩嚣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缓艳,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼互妓。 笑死坤塞,一個胖子當(dāng)著我的面吹牛澈蚌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宛瞄,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盈电!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匆帚,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤旁钧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后歪今,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鞭铆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年焦影,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舶担。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡彬呻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闸氮,到底是詐尸還是另有隱情,我是刑警寧澤蒲跨,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站孙咪,受9級特大地震影響堪唐,放射性物質(zhì)發(fā)生泄漏翎蹈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一合陵、第九天 我趴在偏房一處隱蔽的房頂上張望澄阳。 院中可真熱鬧,春花似錦寇荧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峦嗤。三九已至,卻和暖如春烁设,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背装黑。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留糠睡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓狈孔,卻偏偏與公主長得像材义,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子其掂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容