TxtFileUtil-文本文件操作工具類

在寫工具類或進行文本分析時, 對小文本文件的讀寫是一種很常見的操作. 對於小文件文件, 一次性讀取到內存, 然後再做分析處理, 比邊讀邊處理更快. 因此筆者封裝了一個工具類, 專門用於讀寫小文本文件.

1. API 簡介

  • 核心API 分爲三類: 讀取文件, 寫入文件, 追加文件. 筆者針對常用的默認參數做了一定的方法重載.
  • filter API 需要jdk8 支持
方法簽名 方法描述
List readFile(String filePath) 讀取文件內容, 默認以UTF-8編碼打開文件
public static List readFile(String filePath, String encoding) 讀取文件內容, 以指定編碼格式打開文件
public static List readFile(String filePath, boolean ignoreEmptyLine) 讀取文件內容, 可忽略空行
public static List readFile(String filePath, boolean ignoreEmptyLine, String encoding) 讀取文件內容, 以指定編碼格式打開文件, 可忽略空行
public static List readFile(String filePath, Predicate filter) 讀取文件內容, 可自定義過濾器, 過濾行. 默認以UTF-8編碼打開文件
public static List readFile(String filePath, Predicate ignoreFilter, String encoding) 讀取文件內容.
public static void writeFile(List contents, String filePath) 向文件中追加內容. 默認以UTF-8編碼寫入文件. 當文件已存在時, 進行文件覆蓋
public static void writeFile(List contents, String filePath, boolean overrideFile) 向文件中追加內容, 默認以UTF-8編碼寫入文件
public static void writeFile(List contents, String filePath, String encoding) 向文件中追加內容, 當文件存在時, 會進行文件覆蓋
public static void writeFile(List contents, String filePath, String encoding, boolean overrideFile) 向文件中追加內容.
public static void appendFile(List contents, String filePath) 向文件中追加內容, 默認以UTF-8格式寫入文件, 當文件不存在時創建新的文件.
public static void appendFile(List contents, String filePath, boolean creatNewFile) 向文件中追加內容, 默認寫入文件編碼爲UTF-8
public static void appendFile(List contents, String filePath, String encoding) 向文件中追加內容, 當文件不存在時, 創建新文件
public static void appendFile(List contents, String filePath, String encoding, boolean creatNewFile) 向文件中追加內容.

2. TxtFileUtil 源碼

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

/**
 * @Description: 文本文件讀寫, 當文件內容過大時, 需要考慮內存
 * @author: zongf
 * @date: 2019-06-11 14:37
 */
public class TxtFileUtil {

    /** utf-8 編碼*/
    private static String ENCODING_UTF8 = "UTF-8";

    /** gbk 編碼 */
    private static String ENCODING_GBK = "GBK";

    /** gb2312 編碼 */
    private static String ENCODING_GB2312 = "GB2312";

    /**
     * @Description: 讀取文件內容, 默認以UTF-8編碼打開文件
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @return List<String> 文件內容
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static List<String> readFile(String filePath){
        return readFile(filePath, line -> true, ENCODING_UTF8);
    }

    /**
     * @Description: 讀取文件內容, 以指定編碼格式打開文件
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @param encoding 文件編碼
     * @return List<String> 文件內容
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static List<String> readFile(String filePath, String encoding){
        return readFile(filePath, line -> true, encoding);
    }

    /**
     * @Description: 讀取文件內容, 可忽略空行
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @param ignoreEmptyLine 忽略空行
     * @return List<String> 文件內容
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static List<String> readFile(String filePath, boolean ignoreEmptyLine){
        return readFile(filePath, line -> "".equals(line.trim()), ENCODING_UTF8);
    }

    /**
     * @Description: 讀取文件內容, 以指定編碼格式打開文件, 可忽略空行
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @param ignoreEmptyLine 忽略空行
     * @return List<String> 文件內容
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static List<String> readFile(String filePath, boolean ignoreEmptyLine, String encoding){
        return readFile(filePath, line -> "".equals(line.trim()), encoding);
    }

    /**
     * @Description: 讀取文件內容, 可自定義過濾器, 過濾行. 默認以UTF-8編碼打開文件
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @param filter 過濾器
     * @return List<String> 文件內容
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static List<String> readFile(String filePath, Predicate<String> filter){
        return readFile(filePath, filter, ENCODING_UTF8);
    }


    /**
     * @Description: 讀取文件內容.
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @param encoding 設置以哪種文件編碼打開文件
     * @param ignoreFilter 忽略的行過濾器
     * @return List<String> 文件內容
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static List<String> readFile(String filePath, Predicate<String> ignoreFilter, String encoding) {

        // 創建list 存儲文件內容
        List<String> contents = new ArrayList<String>();

        File file = new File(filePath);

        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(new FileInputStream(file), encoding));

            String line = null;

            while ((line = br.readLine()) != null) {
                if (!ignoreFilter.test(line)) {
                    contents.add(line);
                }
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(filePath + "文件不存在");
        } catch (IOException e) {
            throw new RuntimeException(filePath + "文件打開失敗");
        }finally {
            close(br);
        }
        return contents;
    }

    /**
     * @Description: 向文件中追加內容. 默認以UTF-8編碼寫入文件. 當文件已存在時, 進行文件覆蓋
     * @param contents 文件內容
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static void writeFile(List<String> contents, String filePath){
        writeFile(contents, filePath, ENCODING_UTF8, true);
    }

   /**
     * @Description: 向文件中追加內容, 默認以UTF-8編碼寫入文件
     * @param contents 文件內容
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @param overrideFile 當文件已存在時, 是否進行文件覆蓋.
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static void writeFile(List<String> contents, String filePath, boolean overrideFile){
        writeFile(contents, filePath, ENCODING_UTF8, overrideFile);
    }

    /**
     * @Description: 向文件中追加內容, 當文件存在時, 會進行文件覆蓋
     * @param contents 文件內容
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @param encoding 指定新成文件文件編碼
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static void writeFile(List<String> contents, String filePath, String encoding){
        writeFile(contents, filePath, encoding, true);
    }

    /**
     * @Description: 向文件中追加內容.
     * @param contents 文件內容
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @param encoding 指定新成文件文件編碼
     * @param overrideFile 當文件已存在時, 是否進行文件覆蓋.
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static void writeFile(List<String> contents, String filePath, String encoding, boolean overrideFile) {

        File file = new File(filePath);

        // 校驗文件是否存在
        if(file.exists() && !overrideFile){
            throw new RuntimeException("文件已存在!");
        }

        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), encoding));
            for (String content : contents) {
                bw.write(content);
                bw.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            close(bw);
        }
    }

    /**
     * @Description: 向文件中追加內容, 默認以UTF-8格式寫入文件, 當文件不存在時創建新的文件.
     * @param contents 文件內容
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static void appendFile(List<String> contents, String filePath){
        appendFile(contents, filePath, ENCODING_UTF8, true);
    }

    /**
     * @Description: 向文件中追加內容, 默認寫入文件編碼爲UTF-8
     * @param contents 文件內容
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @param creatNewFile 當文件不存在時, 是否創建新的文件
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static void appendFile(List<String> contents, String filePath, boolean creatNewFile){
        appendFile(contents, filePath, ENCODING_UTF8, creatNewFile);
    }

    /**
     * @Description: 向文件中追加內容, 當文件不存在時, 創建新文件
     * @param contents 文件內容
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @param encoding 指定新成文件文件編碼
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static void appendFile(List<String> contents, String filePath, String encoding){
        appendFile(contents, filePath, encoding, true);
    }


    /**
     * @Description: 向文件中追加內容.
     * @param contents 文件內容
     * @param filePath 文件路徑, 支持相對路徑和絕對路徑
     * @param encoding 指定新成文件文件編碼
     * @param creatNewFile 當文件不存在時, 是否創建新的文件
     * @author: zongf
     * @time: 2019-06-11 15:09:28
     */
    public static void appendFile(List<String> contents, String filePath, String encoding, boolean creatNewFile) {

        File file = new File(filePath);

        // 校驗文件是否存在
        if(!file.exists() && !creatNewFile){
            throw new RuntimeException("文件不存在!");
        }

        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), encoding));
            for (String content : contents) {
                bw.write(content);
                bw.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            close(bw);
        }
    }

    /**
     * @Description: 手工關閉流
     * @param closeable
     * @author: zongf
     * @time: 2019-06-11 15:08:41
     */
    private static void close(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

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