2015-12-17 124 views
1

我目前正在尝试读取文件,修改内部的一些占位符,然后将文件写入输出流。作为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

为什么你读取字节而不是文本,如果你有什么是文本? – Albireo

+1

Response.WriteLine(modifiedLine);'? – Luaan

+0

@Albireo最初的代码不是来自我(我接管了那个项目)。我猜这是因为当时他使用.Write为OutputStream,他不想转换读取的字节,因此使用FileStream .Read方法和读取字节,而不是文本) – Thomas

回答

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")); 
     } 
    } 
} 
+0

以后的方法当前如何编写它只会读取和写入总共一行? – Thomas

+0

@Thomas是的,我脑袋放屁。固定。 – Albireo

+0

可以发生即使是最好的:)接受你的答案。再次在那里! – Thomas

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(file,output);

相关问题