NET2Java之三:文件IO

Java中對於文件的操作主要用File類,它既能操作文件,又能操作目錄,功能類似於.NET中Directory和File的集合,在java7之後,java.nio.file中提供了更爲強大的Files來操作文件。

讀操作

  • exists:判斷文件或者文件夾是否存在
  • isDir:判斷是否是文件夾,所以判斷文件夾是否存在時,不單單要判斷exists,還要判斷isDir
  • isFile:顧名思義,判斷是不是文件
  • list:遍歷文件夾,返回值是文件路徑,不管是文件夾還是文件,一視同仁返回,需要自己篩選,如果沒有子級,返回null
  • listFile:也是遍歷文件夾,不過返回值是File對象,值得一提的是,不管是list還是listFile都不會遍歷子文件夾,需要自己寫遞歸函數,可以考慮使用Files中的walk和walkFileTree來遍歷,如:
Path fp=Paths.get(path);
        Stream<Path> sfp=Files.walk(fp);
//filter是一個篩選器,比如isRegularFile篩選文件、isDirectory篩選文件夾
//你也可以這樣寫:filter(f -> f.endsWith(".txt"))來篩選txt文件
        sfp.filter(Files::isRegularFile).map(x->x.toString()).collect(Collectors.toList());
  • getParent:獲取父級文件名稱,如果沒有父級就返回null
  • getParentFile:同getParent,返回值不同
  • getName:返回當前文件或文件夾的名稱
  • getAbsolutePath:返回絕對地址
  • getFreeSpace:獲取目錄所在磁盤的剩餘空間,以字節爲單位
  • getTotalSpace:獲取目錄所在磁盤的總空間,以字節位單位
  • isAbsolute:判斷文件路徑是否爲絕對路徑
  • isHidden:判斷指定的文件是是隱藏文件
  • length:如果是文件,那就是文件大小;如果是文件夾,那這個就是目錄元數據的大小,文件夾的大小請自行遍歷累加
  • canExecute:能否被執行
  • canRead:能否讀取
  • canWrite:能否修改
  • lastModified:獲取文件的最後一次被修改時間,注意和.NET不同的是,這是一個UTC時間

寫操作

  • mkdir:創建文件夾
  • mkdirs:創建文件夾,與mkdir不同的是,mkdir只會創建最後一級文件夾,若父級文件夾不存在則創建失敗,而mkdirs則會創建路徑上所有不存在的文件夾
  • renameTo:變更文件名稱
  • setExecutable:設置可執行權限
  • setReadable:設置讀取權限
  • setWritable:設置寫權限
  • setLastModified:設置最後一次修改時間
  • delete:刪除文件
  • deleteOnExit:非常有意思的操作,在程序結束時再刪除
  • createNewFile:創建文件

File當中並沒有拷貝操作,需要拷貝的話,需要自己讀取並寫入:

    File f1=new File("D:\\1.txt");
        File f2=new File("D:\\2.txt");
        try{
        FileInputStream fis=new FileInputStream(f1);
        FileOutputStream fos=new FileOutputStream(f2);
        byte[]buffer=new byte[1024];
        int length=fis.read(buffer);
        do{
        fos.write(buffer,0,length);
        length=fis.read(buffer);
        }while(length>0);

        }catch(Exception e){
        e.printStackTrace();
        }

或者使用Files.copy來操作

    Path p1= Paths.get("D:\\1.txt");
    Path p2= Paths.get("D:\\2.txt");
    try {
        Files.copy(p1,p2, StandardCopyOption.REPLACE_EXISTING);
    } catch (IOException e) {
        e.printStackTrace();
    }

文件IO算是java中最常見的操作之一了,很遺憾File中並沒有readAllLines和writeAllLines方法,比較常見的是用FileReader:

    File fl = new File("D:\\屏蔽詞.txt");

    try {
        FileReader fileReader = new FileReader(fl.toString());
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
    }
    bufferedReader.close();
    fileReader.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

當然Files直接封裝了方法:

    Path path = Paths.get("D:\\屏蔽詞.txt");
    try {
        List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
        for (String line : lines) {
            System.out.println(line);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }

不過由於readAllLines會將文件一次性加載到內存中,所以Files中又提供了lines方法來逐行加載,避免大文件操作時的內存損耗,如:


    try {
        Path path = Paths.get("D:\\屏蔽詞.txt");
        Stream<String> lines = Files.lines(path);
        lines.forEach(line -> {
            System.out.println(line);
        });
    } catch (Exception ex) {
        ex.printStackTrace();
    }

此外Scanner中也提供了不少和文件相關的操作:

    File fl = new File("D:\\屏蔽詞.txt");

    try {
        Scanner scanner = new Scanner(fl);
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            System.out.println(line);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }

寫文件一般用FileWriter和BufferedWriter:

    try {
        FileWriter fileWriter = new FileWriter("D:\\新屏蔽詞.txt");
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        for (int i = 0; i < 100; i++) {
            bufferedWriter.write(i + ":測試");
            bufferedWriter.newLine(); //換新行
        }
        bufferedWriter.flush();
        bufferedWriter.close();
        fileWriter.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }

Files中也提供了文件相關的操作:

    try {
        Path path = Paths.get("D:\\屏蔽詞.txt");
        Files.write(path,"別說話".getBytes());
    } catch (Exception ex) {
        ex.printStackTrace();
    }

寫入多行:

    List<String> lines = new ArrayList<>();
    lines.add("第一行");
    lines.add("第二行");
    lines.add("第三行");
    lines.add("第四行");
    lines.add("第五行");

    try {
        Path path = Paths.get("D:\\屏蔽詞.txt");
        Files.write(path, lines, StandardCharsets.UTF_8);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章