gpt4 book ai didi

java - 如何合并 java.io.Reader 的内容或包装 Reader 的内容?

转载 作者:行者123 更新时间:2023-12-02 07:41:11 27 4
gpt4 key购买 nike

我正在 Spring MVC 中包装 Freemarker 模板加载器,如所述 here在 html 页面中进行默认转义。

所以,我需要用我的字符串包装来自 java.io.Reader 的内容,而不是读取它,不将其转换为字符串,也不自己实现。有类似WrappingReader的类吗或流行公共(public)库中的 com.google.common.io.MultiReader(非公开)?

我的实现:

import com.google.common.io.CharStreams;
import com.google.common.io.InputSupplier;

...

private final TemplateLoader delegate;

@Autowired
public HtmlEscapingTemplateLoader(ResourceLoader resourceLoader)
{
delegate = new SpringTemplateLoader(resourceLoader, "/WEB-INF/templates/");
}

@Override
public Reader getReader(Object templateSource, String encoding) throws IOException
{
// collecting readers
Reader prologue = new StringReader("<#escape x as x?html>");
Reader originalReader = delegate.getReader(templateSource, encoding);
Reader epilogue = new StringReader("</#escape>");

// concatenating readers
return merge(prologue, originalReader, epilogue);
}


protected Reader merge(Reader prologue, Reader originalReader, Reader epilogue) throws IOException
{
return CharStreams.join(
Arrays.asList(new ReaderSupplier(prologue), new ReaderSupplier(originalReader), new ReaderSupplier(
epilogue))).getInput();
}

private static class ReaderSupplier
implements InputSupplier<Reader>
{

private final Reader reader;

public ReaderSupplier(Reader reader)
{
this.reader = reader;
}

@Override
public Reader getInput() throws IOException
{
return reader;
}

}

我使用的 CharStreams 标记为@com.google.common.annotations.Beta。那么,是否可以在不使用 CharStreams 的情况下以更可靠的方式重写它?

最佳答案

我只是回答这个问题:如何合并java.io.Reader的。

使用纯Java,我能够想出在InputStreams上使用SequenceInputStream的解决方案,这似乎是合并两个InputStreams<的更好解决方案。请参阅this stackoverflow question用于合并输入流。想法很简单:将读取器转换为 InputStreams,合并它们并将 InputStream 保存到 Reader 中。

Reader reader1 = new StringReader("String1");
Reader reader2 = new StringReader("String2");

ReaderInputStream readInputStream1 = new ReaderInputStream(reader1, StandardCharsets.UTF_8)
ReaderInputStream readInputStream2 = new ReaderInputStream(reader2, StandardCharsets.UTF_8)

Reader merged = new InputStreamReader(new SequenceInputStream(readInputStream1,readInputStream2), StandardCharsets.UTF_8);

关于java - 如何合并 java.io.Reader 的内容或包装 Reader 的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11561950/

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