- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有 3 个 TextReader——StreamReader 和 StringReader 的组合。从概念上讲,它们的串联是一个单一的文本文档。
我想调用一个采用单个 TextReader 的方法(不受我的控制)。是否有任何内置或简单的方法可以从多个 TextReader 中创建一个串联的 TextReader?
(我可以编写自己的 TextReader 子类,但看起来工作量很大。在那种情况下,我只需将它们全部写到一个临时文件中,然后使用单个 StreamReader。)
有没有我缺少的简单解决方案?
最佳答案
我只是把它放在一起,所以它不是 super 健壮(没有错误处理等),但基本测试用例有效。
它的工作原理是为 TextReader
创建一个扩展方法,这需要一秒钟,并返回一个新的 TextReader 类,该类在第一次内部调用 Read()
直到它用完,然后在第二个开始调用 Read()
。您可以无限期地链接它。
要提供 TextReader
的完整实现,您只需实现 Read()
、Peek()
、Close()
和 Dispose()
。所有其他方法都依赖于特定的实现 Read()
来工作。因此,创建您自己的 TextReader
并不是那么糟糕,如下所示。
这也减轻了任何性能问题,因为我们只是包装现有的 TextReader 而不是实际调用它们来执行串联。
class Program
{
static void Main(string[] args)
{
StringReader first = new StringReader("hello ");
StringReader second = new StringReader("world");
StringReader third = new StringReader("!");
using (var allOfThem = first.Concat(second).Concat(third))
{
//writes "hello world!"
Console.WriteLine(allOfThem.ReadToEnd());
}
Console.Read();
}
}
public static class Extensions
{
public static TextReader Concat(this TextReader first, TextReader second)
{
return new ChainedTextReader(first, second);
}
private class ChainedTextReader : TextReader
{
private TextReader first;
private TextReader second;
private bool readFirst = true;
public ChainedTextReader(TextReader first, TextReader second)
{
this.first = first;
this.second = second;
}
public override int Peek()
{
if (readFirst)
{
return first.Peek();
}
else
{
return second.Peek();
}
}
public override int Read()
{
if (readFirst)
{
int value = first.Read();
if (value == -1)
{
readFirst = false;
}
else
{
return value;
}
}
return second.Read();
}
public override void Close()
{
first.Close();
second.Close();
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
first.Dispose();
second.Dispose();
}
}
}
}
关于c# - 如何将多个 TextReader 串在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2925652/
什么是最佳获取方式 TextReader来自 Memory 的实例目的? 我可以这样写: using (var stream = new MemoryStream(body.ToArray())) u
你好。最近,我了解了 TextReader 类以及如何读取文本文件。不过,有些事情我不太明白。 假设这是一个新对象: TextReader TR = new StreamReader(@"C:\Use
我希望 TextReader 具有 Stream 具有的类似功能。特别是在流中设置位置的能力。有什么方法可以将 TextReader 变成流吗? 我想接受一个 TextReader 但像访问 Stre
我使用 TextReader 从文本文件中读取数据 TextReader reader = new StreamReader(stream); string line; while ((line =
我正在尝试使用 System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resource); 读取嵌入的
在(可能)非常大的文本中查找模式的最佳方法是什么。 我可以使用正则表达式,但它接受一个字符串作为参数。有没有办法将它与 TextReader 或某种流一起使用? 最佳答案 不,正则表达式可能需要回溯。
我有一个 TextReader 对象。 现在,我想将 TextReader 的全部内容流式传输到文件中。我无法使用 ReadToEnd() 一次性将所有内容写入文件,因为内容可能很大。 有人可以给我一
我有一个由黑盒系统创建的 TextReader,因此我没有关于创建它的源文件的任何信息。 我需要将此 TextReader 传递回我在我的应用程序中创建的对象内的黑盒系统。 但是,我需要从 TextR
这是一个简化的示例,用于隔离问题的目的。在我的实际场景中,GetColumnReader 返回的 ColumnReader 实际上将完成比 ReadLine 更多的工作。 如果我运行下面的程序,当我尝
我有一个逗号分隔的文本文件,我正在尝试读入。 我一次读 1 行,然后处理该信息。 使用下面的代码片段和文件片段,当我到达以 841 开头的行时,我的错误就出现了——它只包含 147 个字符。 问题是什
过去,我一直使用 BinaryReader 来读取几个字节,但最近,我得到了这个错误: An error has occurred: Probable I/O race condition detec
参见下面的简单单元测试示例 [Test] public void TextReaderRequiresWriteAccessToFile() { using (var reader = Fil
我如何循环遍历 TextReader 中的行来源? 我试过了 foreach (var line in source) 但是报错 foreach statement cannot operate on
我正在尝试使用 StreamReader 读取 pbx 文件,编辑内容并使用 C# 中的 TextReader 将内容显示到新文件。 这是我在 C# 中的第一个开发任务。 我在大学学习 java,我的
我有一个 Location 类,它表示流中某处的位置。 (该类未耦合到任何特定流。)位置信息将用于将标记与我的解析器中的输入位置相匹配,以便向用户报告更好的错误。 我想将位置跟踪添加到 TextRea
我有 3 个 TextReader——StreamReader 和 StringReader 的组合。从概念上讲,它们的串联是一个单一的文本文档。 我想调用一个采用单个 TextReader 的方法(
我正在使用 CSVHelper 库,它只需三行代码就可以从 CSV 文件中提取对象列表: var streamReader = // Create a reader to your CSV file.
我想更改我的代码: string path = @"c:\Directory\test.xml"; XmlSerializer s = new XmlSerializer(typeof(Car));
给定一个 XDocument 实例,如何轻松获得代表该实例的 TextReader? 我能想到的最好的东西是这样的(其中 xml 是一个 XDocument 实例): var s = new Memo
所以我试图让我的程序从文本文件中读取并在命令提示符内显示该文本文件上的内容,就像这样...... 但是随后程序只能读取文件的一行,然后抛出这个错误异常 我已经尝试过他们提示的三个 .cs 文件的行。我
我是一名优秀的程序员,十分优秀!