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