在ActivePivot 5.0中,我正在监视包含我要注入数据存储区的数据的文件。我希望有这个单一的入口点,并且每次更改文件都会更新或插入新数据。
这是我对文件主题的配置:
@Bean
public CSVSource csvSource() {
// Define source
final CSVSource source = new CSVSource();
final List<String> productFileColumns = Arrays.toList("a", "b", "c");
final ICSVTopic myTopic = source.createTopic("myTopic", "path/to/my/file");
myTopic.getParserConfiguration().setSeparator(";");
source.addTopic(myTopic);
// some configuration of the csv source (threads, ...)
...
// Define channel factory
final CSVMessageChannelFactory channelFactory = new CSVMessageChannelFactory(csvSource, datastore);
...
// Listen some topics
final Map<String, String> topicsToListen = new HashMap<>();
topicsToListen.put("myTopic_Store", "myTopic");
final Listen<IFileInfo, ILineReader> listener = new Listen<>(channelFactory, topicsToListen);
listener.listen(csvSource);
}
我的代码更新文件:
public void updateFile() {
final Path path = Paths.get("path/to/my/file");
// Write and truncate
Files.write(path, "1;2;3".getBytes(), StandardOpenOption.TRUNCATE_EXISTING);
// Add another data
Files.write(path, "4;5;6".getBytes(), StandardOpenOption.APPEND);
// Add another data
Files.write(path, "7;8;9".getBytes(), StandardOpenOption.APPEND);
}
我的问题是我看到CSV文件对我的文件进行了多次处理,而我希望每次调用#updateFile时只处理一次。
注意:目前,我想使用Java更新我的文件,而不是手动或使用其他语言。
感谢您的帮助。
答案 0 :(得分:0)
CSV源会侦听您文件的修改,并在每次看到文件时处理您的文件。每当您拨打Files.write(...)
时,您正在修改文件,CSV源会看到并解析它。由于有三次调用Files.write(...),因此CSV源将对其进行三次处理。
您有两种方法可以实现此目的:
执行批量写入:累积您需要写入文件的内容,并仅在函数末尾写入。但这可能不适合您的设计,并使用更多的瞬态内存。
由于您无论如何都要完全重写文件,因此您可以将数据写入另一个文件,然后使用Files.move
和{{1}使用StandardCopyOptions.ATOMIC_MOVE
替换旧文件选项。