Java8使用Function讀取文件
首先,我們需要一個 FileCloseAble 類來處理文件寫入操作。
import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.List;
public class FileCloseAble<T> implements AutoCloseable {
private Consumer<List<T>> writer;
private int pageSize;
private List<T> buffer;
public FileCloseAble(Consumer<List<T>> writer, int pageSize) {
this.writer = writer;
this.pageSize = pageSize;
this.buffer = new ArrayList<>(Math.max(1, pageSize));
}
public void add(T element) {
buffer.add(element);
if (buffer.size() >= pageSize) {
flush();
}
}
private void flush() {
if (!buffer.isEmpty()) {
writer.accept(new ArrayList<>(buffer));
buffer.clear();
}
}
@Override
public void close() {
flush();
}
}
FileContext 類來存儲文件的上下文信息。
public class FileContext {
private File file;
private Charset charset;
private int skipHeader;
private String batchDate;
private int pageSize;
private boolean deleteFlag;
private String filterLineHeader;
// 構(gòu)造函數(shù)、getter 和 setter 省略
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public Charset getCharset() {
return charset;
}
public void setCharset(Charset charset) {
this.charset = charset;
}
public int getSkipHeader() {
return skipHeader;
}
public void setSkipHeader(int skipHeader) {
this.skipHeader = skipHeader;
}
public String getBatchDate() {
return batchDate;
}
public void setBatchDate(String batchDate) {
this.batchDate = batchDate;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public boolean isDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(boolean deleteFlag) {
this.deleteFlag = deleteFlag;
}
public String getFilterLineHeader() {
return filterLineHeader;
}
public void setFilterLineHeader(String filterLineHeader) {
this.filterLineHeader = filterLineHeader;
}
}
FileHandler 類
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.stream.Stream;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Slf4j
public class FileHandler<T, R> {
private FileContext context;
private BiFunction<String, String, T> reader; // 讀邏輯
private Consumer<List<T>> writer;// 寫邏輯
private LineFilter lineFilter; // 新增過濾邏輯
public void execute() throws Exception {
File file = context.getFile();
try (
Stream<String> streams = Files.lines(Paths.get(file.getPath()), context.getCharset());
FileCloseAble<T> files = new FileCloseAble<>(writer, context.getPageSize())
) {
streams.skip(context.getSkipHeader())
.filter(lineFilter.getLinePredicate())
.map(e -> reader.apply(e, context.getBatchDate()))
.forEach(files::add);
} catch (Exception e) {
log.error("解析文件失敗: file: {}, error: {}", file, e);
throw new Exception("文件處理異常", e);
} finally {
deleteFileIfNecessary(file);
}
}
private void deleteFileIfNecessary(File file) {
if (context.isDeleteFlag() && file.exists()) {
try {
boolean deleted = Files.deleteIfExists(file.toPath());
if (deleted) {
log.info("文件已刪除: {}", file);
} else {
log.info("文件不存在,無法刪除: {}", file);
}
} catch (Exception e) {
log.error("刪除文件失敗: file: {}, error: {}", file, e);
}
}
}
}定義一個過濾函數(shù)接口
定義一個 Predicate 接口,用于表示每一行的過濾邏輯。
import java.util.function.Predicate;
public interface LineFilter {
Predicate<String> getLinePredicate();
}
實現(xiàn) LineFilter 接口
創(chuàng)建一個實現(xiàn)了 LineFilter 接口的類,用于定義具體的過濾邏輯。
import java.util.function.Predicate;
public class CustomLineFilter implements LineFilter {
private String filterLineHeader;
public CustomLineFilter(String filterLineHeader) {
this.filterLineHeader = filterLineHeader;
}
@Override
public Predicate<String> getLinePredicate() {
return line -> !line.startsWith(filterLineHeader);
}
}
使用 FileHandler 類
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Consumer;
public class FileHandlerExample {
public static void main(String[] args) {
// 創(chuàng)建文件上下文
FileContext context = new FileContext();
File file = new File("D:\\temp\\testwrite.txt");
context.setFile(file);
context.setCharset(StandardCharsets.UTF_8);
context.setSkipHeader(0);
context.setBatchDate("20220101");
context.setPageSize(100);
context.setDeleteFlag(false);
// 定義解析方法
BiFunction<String, String, String> reader = (line, batchDate) -> line.trim();
// 定義寫入方法
Consumer<List<String>> writer = list -> {
for (String s : list) {
System.out.println(s);
}
};
// 創(chuàng)建自定義過濾邏輯
LineFilter lineFilter = new CustomLineFilter("#");
// 創(chuàng)建 FileHandler 實例
FileHandler<String, Void> fileHandler = FileHandler.<String, Void>builder()
.context(context)
.reader(reader)
.writer(writer)
.lineFilter(lineFilter) // 設(shè)置過濾邏輯
.build();
// 執(zhí)行文件處理
try {
fileHandler.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
}
可以愉快的讀寫文件啦
到此這篇關(guān)于Java8使用Function讀取文件的文章就介紹到這了,更多相關(guān)Java8 Function讀取文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot2.x只需兩步快速整合log4j2的方法
這篇文章主要介紹了springboot2.x只需兩步快速整合log4j2的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05
springboot @validated List校驗失效問題
這篇文章主要介紹了springboot @validated List校驗失效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
springAOP中用joinpoint獲取切入點方法的參數(shù)操作
這篇文章主要介紹了springAOP中用joinpoint獲取切入點方法的參數(shù)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

