Java IO實踐

weixin_33670713發表於2018-08-26

(一) 在電腦D盤下建立一個檔案為HelloWorld.txt檔案,判斷他是檔案還是目錄,在建立一個目錄IOTest,之後將HelloWorld.txt移動到IOTest目錄下去;之後遍歷IOTest這個目錄下的檔案.

public class Ex1 {
    public static void main(String[] args) {
        File hw = new File("U:", "HelloWorld.txt");
        //檔案建立用createNewFile()方法, 成功返回true
        try {
            boolean success = hw.createNewFile();
            if(success) {
                System.out.println("檔案建立成功");
            } else {
                System.out.println("檔案建立失敗");
            }
        } catch (IOException e) {
            System.out.println("檔案建立失敗");
        }

        if(hw.isFile()) {
            System.out.println("It's a File.");
        }
        if(hw.isDirectory()) {
            System.out.println("It's a Directory.");
        }

        //建立目錄mkdir
        File dir = new File("U:/IOTest");
        //如果路徑中有其他目錄不存在,則建立
        dir.mkdirs();

        //檔案移動renameTo
        if(hw.renameTo(new File(dir.getPath(), hw.getName()))) {
            System.out.println("檔案移動成功");
        } else {
            System.out.println("檔案移動失敗");
        }

        //遍歷檔案呼叫list
        for(String c : dir.list()) {
            System.out.println(c);
        }
    }
}

注意: new File()並不會建立任何檔案或目錄,而只是建立一個抽象物件,真的在檔案系統中建立檔案或者目錄需要呼叫相應的方法,createNewFile()或者mkdir(), mkdirs()。均返回boolean,代表建立成功與否。

(二) 遞迴實現輸入任意目錄,列出檔案以及資料夾

public class Ex2 {
    private static void list(File file, String leadingSpaces) {
        if(file.isFile()) {
            System.out.println(leadingSpaces + file.getName());
            return;
        }
        if(file.isDirectory()) {
            System.out.println(leadingSpaces + file.getName());
            for(File sf : file.listFiles()) {
                list(sf, leadingSpaces + "   ");
            }
        }
    }

    public static void main(String[] args) {
        File file = new File("U:/KenView");
        list(file, "");
    }
}

注意:list() vs. listFiles()
list() 返回子檔案和目錄的名字資料
listFiles() 返回子檔案陣列

(三) 遞迴實現列出當前工程下所有.java檔案

public class Ex3 {
    public static void listJavaFiles(File file) {
        if(file.exists()) {
            if(file.isFile() && file.getName().toLowerCase().endsWith(".java")) {
                System.out.println(file.getPath());
                return;
            }
            if(file.isDirectory()) {
                for(File f : file.listFiles()) {
                    listJavaFiles(f);
                }
            }
        }
    }

    public static void main(String[] args) {
        listJavaFiles(new File(".."));
    }
}

注意:學會使用相對路徑

//得到當前路徑
 listFiles(new File("."));
//得到上一級目錄
listFiles(new File(".."));

(四)檢視D盤中所有的檔案和資料夾名稱,並且使用名稱升序降序,資料夾在前和資料夾在
後,檔案大小排序等。


public class Ex4 {
    private static List<File> list(File file) {
        List<File> list = new ArrayList();
        if(file.exists()) {
            if(file.isFile()) {
                list.add(file);
            }
            if(file.isDirectory()) {
                for(File f : file.listFiles()) {
                    list.addAll(list(f));
                }
            }
        }
        return list;
    }

    public static void main(String[] args) {
        List<File> list = list(new File("U:/KenView"));
        //檔名稱排序
        list.sort((f1, f2) -> f1.getPath().compareTo(f2.getPath()));
        list.stream().forEach(f -> System.out.println(f.getPath()));

        //檔案大小排序
        list.sort((f1, f2) -> (int) (f1.length() - f2.length()));
        list.stream().forEach(f -> {
            System.out.printf("%5d  %s", f.length(), f.getPath());
            System.out.println();
        });
    }
}

注意:file.length()得到檔案大小

/**
     * Returns the length of the file denoted by this abstract pathname.
     * The return value is unspecified if this pathname denotes a directory.
**/

(五) 在程式中寫一個"HelloJavaWorld你好世界"輸出到作業系統檔案Hello.txt檔案中

    private static void inOut(String s, File outFile) {
        BufferedReader reader = null;
        BufferedWriter writer = null;
        try {
            if(!outFile.exists()) {
                outFile.createNewFile();
            }
            reader = new BufferedReader(new StringReader(s));
            writer = new BufferedWriter(new FileWriter(outFile));
           
            String line;
            while((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
            }
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
            }
        }
    }

注意:write()之後記得flush()
檔案寫完記得關閉