File對象的基本操作學習

對File的一些基礎操作

在學習的過程當中主要看了java的api,同時參考apache的一些file工具類,io工具類,感覺收穫不小

  1. 新增文件
  2. 新增文件目錄,若目錄不存在,自動進行創建;File對象的createFile方法不支持目錄不存在的創建
    • 支持多級空目錄的創建
  3. 刪除文件目錄,若目錄裏面存在文件,則進行遞歸刪除
    • 支持多級目錄的刪除,支持非空目錄刪除
  4. 移動文件(目錄)到指定的位置
  5. 複製文件(目錄)到指定的位置,在複製含有文件的目錄的時候未完成
    • 目標目錄爲空時,自動創建
    • 支持複製文件夾及文件夾下的文件
  6. 顯示文件內容

需要注意事項

  • createNewFile不支持目錄不存在的文件創建方法
  • mkdirs支持多目錄不存在的遞歸創建
  • rename只支持同級目錄下的重命名,不支持不同目錄的重命名
  • intputStream入參對象不能爲目錄

package com.pgy.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;

public class FileApi {

    /** 文件讀取結束標誌  */
    private static final int EOF                 = -1;

    /** 默認讀取空間大小 */
    private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;

    public static void main(String[] args) {

        String deleteFilePath = "/Users/admin/logs/aa/";
        String createFilePath = "/Users/admin/logs/aa/bb/cc/test.txt";
        String targetFilePath = "/Users/admin/logs/aa/bb/cc/";
        String sourceDirPath = "/Users/admin/logs/aa/bb/dd/";
        File createFile = new File(createFilePath);
        File DeleteFile = new File(deleteFilePath);
        File targetFile = new File(targetFilePath);
        File sourceFile = new File(sourceDirPath);
        //        createFile(createFile);
        //
        //        copyFile(targetFile, sourceFile);
        //
        //        mvFile(createFile, targetFile);
        //        deleteFile(DeleteFile);

        //        System.out.println(getFileContent(targetFile, "utf-8"));
    }

    /**
     * 獲取file當中的內容,爲string類型
     * @param file file對象
     * @param charset 字符串編碼
     * @return
     */
    public static final String getFileContent(File file, String charset) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
            Reader reader = new InputStreamReader(fis, charset);
            StringWriter sw = new StringWriter();
            parseReaderToWrite(reader, sw);
            return sw.toString();
        } catch (Exception e) {
        }
        return null;
    }

    /**
     * File.rename方法只支持同級目錄下的重命名
     * 先拷貝文件,然後再刪除源文件
     * @param sourceFile
     * @param targetFile
     */
    public static final void mvFile(File sourceFile, File targetFile) {
        copyFile(sourceFile, targetFile);
        deleteFile(sourceFile);
    }

    /**
     * 用FileInputStream與FileOutputStream方式進行對文件的讀寫操作,完成copy
     * 也可以通過FileReader與FileWirte進行實現
     * @param sourceFile
     * @param targetFile
     */
    public static final void copyFile(File sourceFile, File targetFile) {
        FileInputStream fis = null;
        FileOutputStream fos = null;

        if (!targetFile.exists()) {
            createFile(targetFile);
        }
        try {
            File[] fileList = sourceFile.listFiles();
            for (File file : fileList) {

                File newTargetFile = null;

                if (file.isFile()) {
                    fis = new FileInputStream(file);
                    newTargetFile = new File(targetFile, file.getName());
                    fos = new FileOutputStream(newTargetFile);
                    parseInputStreamToOutputStream(fis, fos);
                    fis.close();
                    fos.close();
                }
                if (file.isDirectory()) {
                    File oldFile = new File(sourceFile, file.getName());
                    File newFile = new File(targetFile, file.getName());
                    copyFile(oldFile, newFile);
                }
            }

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

    }

    /**
     * 將inputStream轉換爲OutputStream
     * @param input
     * @param output
     * @return
     * @throws IOException
     */
    public static long parseInputStreamToOutputStream(InputStream input, OutputStream output)
                                                                                             throws IOException {
        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        long count = 0;
        int n = 0;
        while (EOF != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }

    /**
     * 將reader轉換爲write
     * @param input
     * @param output
     * @return
     * @throws IOException
     */
    public static long parseReaderToWrite(Reader input, Writer output) throws IOException {
        char[] buffer = new char[DEFAULT_BUFFER_SIZE];
        long count = 0;
        int n = 0;
        while (EOF != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }

    /**
     * 刪除文件
     * File.delete不支持目錄不爲空的刪除
     * 判斷file對象列表當中的目錄進行循環刪除
     * @param file
     */
    public static final void deleteFile(File file) {

        if (file.exists()) {
            file.delete();
        }

        if (file.isDirectory()) {
            File[] fileList = file.listFiles();
            for (File fileChild : fileList) {
                deleteFile(fileChild);
            }
        }
    }

    /**
     * File對象createFile方法,不支持目錄不存在的文件創建
     * 對其parent進行判斷,若不存在,則對目錄先進行遞歸創建
     * 
     * @param filePath
     */
    public static final void createFile(File file) {

        File fileDir = file.getParentFile();
        if (!fileDir.exists()) {
            fileDir.mkdirs();
        }
        if (!file.getName().contains(".") && !file.exists()) {
            file.mkdir();
        }
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 合併字符串爲目錄
     * 由於不同的操作系統當中對於目錄的層級分割是不一樣的,例如:windows:\  其它的:/
     * 在拼接目錄的時候我們不能單純的使用/或\來進行拼接
     * @param parent
     * @param child
     * @return
     */
    public static final File spliceFile(String parent, String child) {
        return new File(parent, child);
    }

    public static void fileInfoPrint(File file) throws IOException {
        System.out.println(file.canRead());
        System.out.println(file.canWrite());
        System.out.println(file.canExecute());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getAbsoluteFile());
        System.out.println(file.getCanonicalPath());
        System.out.println(file.getUsableSpace());
        System.out.println(file.getTotalSpace());
        System.out.println(file.getName());
        System.out.println(file.getParent());
        System.out.println(file.getParentFile());
        System.out.println(file.getPath());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.isHidden());
        System.out.println(file.isAbsolute());
        System.out.println(file.length());
        System.out.println(file.exists());
        System.out.println(file.hashCode());
        System.out.println(file.toString());
        System.out.println(file.toPath());
        System.out.println(file.toURI());

        file.setExecutable(true, false);
        file.setReadable(true);
        file.setWritable(true);
        file.setReadOnly();
    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章