当前位置: 代码网 > it编程>编程语言>Java > Java8使用Function读取文件

Java8使用Function读取文件

2024年12月26日 Java 我要评论
首先,我们需要一个 filecloseable 类来处理文件写入操作。import java.util.arraylist;import java.util.function.consumer;imp

首先,我们需要一个 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;

    // 构造函数、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);
            }
        }
    }
}

定义一个过滤函数接口

定义一个 predicate 接口,用于表示每一行的过滤逻辑。

import java.util.function.predicate;

public interface linefilter {
    predicate<string> getlinepredicate();
}

实现 linefilter 接口

创建一个实现了 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) {
        // 创建文件上下文
        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);
            }
        };

        // 创建自定义过滤逻辑
        linefilter linefilter = new customlinefilter("#");

        // 创建 filehandler 实例
        filehandler<string, void> filehandler = filehandler.<string, void>builder()
                .context(context)
                .reader(reader)
                .writer(writer)
                .linefilter(linefilter) // 设置过滤逻辑
                .build();

        // 执行文件处理
        try {
            filehandler.execute();
        } catch (exception e) {
            e.printstacktrace();
        }
    }
}

可以愉快的读写文件啦

到此这篇关于java8使用function读取文件的文章就介绍到这了,更多相关java8 function读取文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com