有没有更好的方法来编写读取和修改文本行并将其写入输出流?

时间:2015-12-17 12:44:16

标签: c# asp.net file-io

我目前正在尝试读取文件,修改一些占位符,然后将文件写入输出流。作为aspx.net中页面响应的输出流,我在那里使用OutputStream.Write方法(文件最后是一个附件)。

原来我有:

using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    while (readBytes < fs.Length)
    {
        tmpReadBytes = fs.Read(bytes, 0, bytes.Length);
        if (tmpReadBytes > 0)
        {
            readBytes += tmpReadBytes;
            page.Response.OutputStream.Write(bytes, 0, tmpReadBytes);
        }
    }
}

在考虑完之后我想出了以下内容:

foreach(string line in File.ReadLines(filename))
{
   string modifiedLine = line.Replace("#PlaceHolder#", "NewValue");      
   byte[] modifiedByteArray = System.Text.Encoding.UTF8.GetBytes(modifiedLine);    
   page.Response.OutputStream.Write(modifiedByteArray, 0, modifiedByteArray.length);
}

但它看起来效率低下,特别是对于转换。所以我的问题是:有没有更好的方法呢?

请注意,文件本身不是很大,它是一个大约3-4 KB大小的文本文件。

2 个答案:

答案 0 :(得分:2)

您不需要处理自己的字节。

如果你知道文件是,并且总是很小,

this.Response.Write(File.ReadAllText("path").Replace("old", "new"));

,否则

using (var stream = new FileStream("path", FileMode.Open))
{
    using (var streamReader = new StreamReader(stream))
    {
        while (streamReader.Peek() != -1)
        {
            this.Response.Write(streamReader.ReadLine().Replace("old", "new"));
        }
    }
}

答案 1 :(得分:0)

获取字符串数组中的行:

string[] lines = File.ReadAllLines(file);

要改变线条,请使用循环。

for (int i = 0; i < lines.Length; i++)
{
    lines[i] = lines[i].Replace("#PlaceHolder#", "NewValue");
}

要保存新文本,首先要创建一个包含所有行的字符串。

string output = "";
foreach(string line in lines)
{
    output+="\n"+line;
}

然后将字符串保存到文件中。

File.WriteAllText(文件,输出);