如何在Spring Integration中为FileSplitter配置自定义分隔符
问题解答
首先纠正1个认知偏差:
@Splitter是Spring Integration提供的装配拆分器的注解,本身没有默认分隔符,拆分逻辑由你绑定的拆分器实现类决定。你当前使用的FileSplitter默认确实是按换行符\n拆分文件内容,这个判断是正确的。
你的补充思路完全可行,FileSplitter本身没有提供自定义分隔符的配置项,它的设计目标就是按行拆分大文件、避免全量加载内容到内存。如果要按逗号拆分CSV文件,可以根据文件体积选择以下两种实现方案:
方案1:FileToStringTransformer + DefaultMessageSplitter(适合小体积CSV)
该方案实现简单,不需要额外自定义逻辑,配置代码如下:
// 新增文件转字符串转换器,将文件内容全量读取为字符串 @Bean @Transformer(inputChannel = "fileAdapterInCh", outputChannel = "fileToStringCh") public FileToStringTransformer fileToStringTransformer() { FileToStringTransformer transformer = new FileToStringTransformer(); // 可按需指定文件编码,默认使用系统编码 transformer.setDefaultCharset(StandardCharsets.UTF_8.name()); return transformer; } // 替换原有FileSplitter,使用支持自定义分隔符的DefaultMessageSplitter @Bean @Splitter(inputChannel = "fileToStringCh", outputChannel = "testing1") public DefaultMessageSplitter csvSplitter() { DefaultMessageSplitter splitter = new DefaultMessageSplitter(); // 指定逗号为分隔符 splitter.setDelimiters(","); // 可开启自动过滤空字符串、自动trim空格 splitter.setDeleteEmptyStrings(true); return splitter; }
- 优势:配置灵活,支持分隔符自定义、空串过滤等常用需求,开发成本低
- 劣势:会全量加载文件内容到内存,不适用于GB级以上的超大CSV文件
方案2:自定义FileSplitter子类(适合大体积CSV)
如果处理的CSV文件体积很大,担心OOM问题,可以继承FileSplitter重写字节流读取逻辑,按逗号逐段读取拆分,全程不需要加载全量文件内容,内存占用极低,缺点是需要自行实现流拆分的逻辑,开发成本更高。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

