根据Range
类的Java文档
范围最多可以无限制* *。可以通过指定 通过{@link Range#UPPER_BORDER_NOT_DEFINED}}作为最大值*或 使用构造函数{@link #Range(int)}
我有一个像
SomeText sometext等
更新:InputFile 基本上我有这样的多行数据集。 Itemid 是记录器的开始标识符。经过大量的努力,我正在使用SingleItemPeekableItemReader
,PatternMatchingCompositeLineTokenizer
,它可以正常工作并且能够读取所需pojo中的数据。该解决方案基于
https://docs.spring.io/spring-batch/4.0.x/reference/html/common-patterns.html#multiLineRecords。
但作为
Itemid1-ID1
SomeRandomText1SomeRandomText1SomeRandomText1
SomeRandomText1
SomeRandomText1SomeRandomText1SomeRandomText1
Itemid2-ID2
SomeRandomText1SomeRandomText1
SomeRandomText1
SomeRandomText1
SomeRandomText1SomeRandomText1
数据项类似于
class Pojo
{
String id
String data // this data is concatenated string of of all remaining lines. until
//new data iteam
}
如果我想配置FixedLengthTokenizer
以便在n个单个字段中阅读
public FixedLengthTokenizer head()
{
FixedLengthTokenizer token = new FixedLengthTokenizer();
token.setNames("id");
token.setColumns(new Range(1));
return token;
}
我的期望是,如果我没有在Range构造函数中提供最大限制,那么它将读取整行。但是我得到行长于最大范围1异常
有人可以帮忙吗?
答案 0 :(得分:1)
在您的情况下,您需要指定两个范围:一个用于ID,另一个用于实际数据。这是一个示例:
@Test
public void testFixedLengthTokenizerUnboundedRange() {
FixedLengthTokenizer tokenizer = new FixedLengthTokenizer();
tokenizer.setNames("id", "data");
tokenizer.setColumns(new Range(1, 5), new Range(6));
FieldSet tokens = tokenizer.tokenize("12345\nSomeRandomText1\nSomeRandomText2");
assertEquals("12345", tokens.readString("id"));
assertEquals("SomeRandomText1\nSomeRandomText2", tokens.readString("data"));
}
此测试通过。因此,无限制范围正在按预期工作。
希望该示例有所帮助。