就我而言,我有五个巨大的文本文件,我必须将它们嵌入到一个文本文件中。
我尝试使用StreamReader(),但我不知道如何使它读取另一个文件,我是否必须分配另一个变量?
展示一个例子将不胜感激。
最佳答案
新答案
(请参阅下面有关原始答案的说明。)
static void CopyFiles(string dest, params string[] sources)
{
using (TextWriter writer = File.CreateText(dest))
{
// Somewhat arbitrary limit, but it won't go on the large object heap
char[] buffer = new char[16 * 1024];
foreach (string source in sources)
{
using (TextReader reader = File.OpenText(source))
{
int charsRead;
while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer, 0, charsRead);
}
}
}
}
}
这个新答案很像马丁的方法,除了:
它读入一个较小的缓冲区。 16K在几乎所有情况下都是可以接受的,并且不会在大型对象堆(不会被压缩)上结束
它读取文本数据而不是二进制数据,原因有两个:
可以轻松地修改代码,以从一种编码转换为另一种编码
如果每个输入文件都包含一个字节序标记,那么阅读器将跳过该字节序,而不是以在输入文件边界分散在输出文件中的字节序标记结尾
原始答案
Martin Stettner在下面的答案中指出了一个问题-如果第一个文件结束时没有换行符,它将在输出文件中仍然创建换行符。同样,它将换行符转换为“ \ r \ n”,即使以前只是“ \ r”或“ \ n”也是如此。最后,毫无疑问地冒了长时间使用大量数据的风险。
就像是:
static void CopyFiles(string dest, params string[] sources)
{
using (TextWriter writer = File.CreateText(dest))
{
foreach (string source in sources)
{
using (TextReader reader = File.OpenText(source))
{
string line;
while ((line = reader.ReadLine()) != null)
{
writer.WriteLine(line);
}
}
}
}
}
请注意,这是逐行读取的,以避免一次读入过多的内存。如果您愿意将每个文件完全读入内存(一次仍是一个),则可以使其更简单:
static void CopyFiles(string dest, params string[] sources)
{
using (TextWriter writer = File.CreateText(dest))
{
foreach (string source in sources)
{
string text = File.ReadAllText(source);
writer.Write(text);
}
}
}
关于c# - 如何读取多个文本文件并将其保存到一个文本文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/884884/