gpt4 book ai didi

java - Guava + 合并多个文件并跳过重复的标题

转载 作者:行者123 更新时间:2023-12-02 06:41:40 24 4
gpt4 key购买 nike

我正在努力实现以下目标。

假设我们有两个文件 - 文件 1 和文件 2,其内容如下

文件1:

header
d1
d2

文件2:

header
d3
d4

那么合并后的文件应该是

输出文件:

header
d1
d2
d3
d4

请注意,我们正在跳过第二个文件中的 header 。我使用 Guava 在 Java 中编写了以下代码。

    LinkedList<InputSupplier<BufferedReader>> listOfSuppliers = 
new LinkedList<InputSupplier<BufferedReader>>();

boolean firstFile = true;
for (Path path : inputPaths) {

InputSupplier<BufferedReader> reader = newBufferedReaderSupplier(fs.open(path));
if (!firstFile) {
String ignored = reader.getInput().readLine();
LOGGER.info("Ignored header from the second file " + ignored);
}
listOfSuppliers.add(reader);
firstFile = false;
}

InputSupplier<Reader> combined = CharStreams.join(listOfSuppliers);
OutputSupplier<OutputStreamWriter> outputStream
= Files.newWriterSupplier(output, Charsets.UTF_8, false);
CharStreams.copy(combined, outputStream);

这段代码的问题是,当我们跳过 header 时,输出文件没有第二个文件的内容。我认为 BufferedReader 正在做一些导致整个文件被忽略的事情。

知道如何解决这个问题吗?

最佳答案

恐怕,这一切都是错误的。来自 InputSupplier.getInput() javadoc:

Like Iterable#iterator, this method may be called repeatedly to get independent channels to the same underlying resource.

这与您所做的相反

String ignored = reader.getInput().readLine();

我猜,你的InputSupplier不遵守契约(Contract)。如果是这样,上面的行将是空操作。此外,它会使流保持打开状态。1

您从未说过您的文件很大,因此通过 Files.readLines 读取所有文件,手动删除除第一个文件之外的所有文件的标题行,并连接是恕我直言的正确方法。

<小时/>

如果您发现它效率低下,请注意,最耗时的部分可能是字节到字符和反向转换。使用 UTF-8(和许多其他编码),可以使用 InputStream 轻松跳过第一行(请注意,BufferedReader 会考虑“\r”、“\”中的任何一个) n”,或“\r\n”作为换行符)。但要小心root of all evil !

<小时/>

1 虽然供应商的设计初衷是为了防止资源泄漏,但他们没有魔法实现这一目标。它们在 Byte/CharStreams 方法中的使用确保了所有内容都已关闭。

关于java - Guava + 合并多个文件并跳过重复的标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19085301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com