c# streamWriter 的write方法是添加还是覆盖??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# streamWriter 的write方法是添加还是覆盖??相关的知识,希望对你有一定的参考价值。

streamWriter 的write方法好像是可以向文件末尾添加字符串,例如:

streamWriter my = new streamWriter(“C:\\test”);
my.write("OK"); my.flush();

那么write方法能否覆盖文件内容呢??

另外,我用write()方法时发现,如果后面没有flush()语句,就不能真的写入文件,为什么??

我觉得应该这样理解,首先你在streamWriter my =new streamWriter("c:\\text",true);就可以添加到这个txt文件中,如果没有true的话,就默认为替换。然后flush()我理解为streamwriter的方法只是将内容放在内存中,并没有真正的写到文件中,flush()清空内存,将数据写到文件中。 参考技术A StreamWriter.Write 是追加,而且是前面。例如原文本是 123456,当你 Write(“789”)后得到的结果是 789123456。
如果你是要替换该文件的内容,你可以使用 FileInfo 对象,指向你需要替换的文件,先用 FileInfo.Delete 将其删除,再写入就是新内容了。
我不会 C#,我这是 VB 的:
If fi文件 IsNot Nothing Then
fi文件.Delete()
Using sw As New StreamWriter(fi文件.OpenWrite)
sw.Write(txt主.Text)
End Using
Else
Dim sfd As New SaveFileDialog
With sfd
If di当前文件夹 Is Nothing Then
.InitialDirectory = FileIO.SpecialDirectories.MyDocuments
Else
.InitialDirectory = di当前文件夹.FullName
End If
.Filter = ("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*")
.AddExtension = True
If .ShowDialog = DialogResult.OK Then
fi文件 = New FileInfo(.FileName)
fi文件.Delete()
Using sw As New StreamWriter(fi文件.OpenWrite, System.Text.Encoding.Default)
sw.Write(txt主.Text)
End Using
End If
End With
End If
boo是否更改 = False
fi当前文件 = fi文件
Me.Text = fi当前文件.Name & "-文本编辑器"
用 Using 可以保证 End Using 之后写入文件……
参考技术B write方法不会覆盖文件内容```
my.flush(); //是清空缓存区的垃圾
不清空可能出错```本回答被提问者采纳

C# 单元测试 StreamWriter 参数

【中文标题】C# 单元测试 StreamWriter 参数【英文标题】:C# Unit Test a StreamWriter parameter 【发布时间】:2012-09-10 22:14:39 【问题描述】:

我有一堆类都实现了一个接口,其中一个参数是 StreamWriter。

我需要检查 StreamWriter 的内容。

我正在尝试寻找一种方法来避免在测试服务器上写入文本文件并打开它们来检查内容。

有没有办法快速将 StreamWriter 内容/流转换为 StringBuilder 变量?

【问题讨论】:

【参考方案1】:

您无法检查StreamWriter。您可以检查它正在写入的底层流。因此,您可以在单元测试中使用 MemoryStream 并将 StreamWriter 指向它。完成写入后,您可以从中读取。

[TestMethod]
public void SomeMethod_Should_Write_Some_Expected_Output()

    // arrange
    using (var stream = new MemoryStream())
    using (var writer = new StreamWriter(stream))
    
        // act
        sut.SomeMethod(writer);

        // assert
        string actual = Encoding.UTF8.GetString(stream.ToArray());
        Assert.AreEqual("some expected output", actual);
    

【讨论】:

StreamWriter 默认使用 UTF-8,因此应该使用它来获取 actual 这行得通,谢谢。唯一不同的是我在 using 之外声明了实际的字符串 var,并在 using 之外对其进行了测试。【参考方案2】:

如果可能的话,我建议您将参数更改为TextWriter - 此时您可以使用StringWriter

或者,您可以在MemoryStream 周围创建一个StreamWriter,然后稍后测试该MemoryStream 的内容(通过倒回它,或者只是调用ToArray() 以将完整内容作为字节数组获取。如果你真的想测试 text,使用StringWriter 肯定更简单。

【讨论】:

或许能改,但接口正在被其他几个类使用。 @user295734:任何使用的东西仍然可以传入StreamWriter - 但如果你真的只是想要一些东西,你可以写文本到@987654331 @ 几乎可以肯定是一个更好的抽象使用。您应该只需要更改界面的实现 ...我希望它们会很好。 如果我刚开始,我可能会回去进行更改,其他人的代码要更改的地方太多了,所以我没有时间测试他们所有的代码(猜他们应该为他们的代码编写单元测试。)感谢下次提醒。【参考方案3】:

在这种情况下,您需要模拟测试用例。你可以使用像 rhino mocks 这样的框架。 mocking 框架的优点是,可以验证对象的内容,但不必打服务器或占用服务器资源。

此链接将为您提供基本示例:http://www.codeproject.com/Articles/10719/Introducing-Rhino-Mocks

【讨论】:

为什么你认为在这种情况下需要模拟?如果 OP 想要测试他的代码在错误情况下的行为,那么 Mocking 会有所帮助,但要找出正在编写的内容,则无需使用 mocking。

以上是关于c# streamWriter 的write方法是添加还是覆盖??的主要内容,如果未能解决你的问题,请参考以下文章

调用 Stream.Write 和使用 StreamWriter 有啥区别?

c#中文件读写StreamWriter问题

C# 单元测试 StreamWriter 参数

C# streamwriter方法写入汉字时乱码

30天C#基础巩固------读写流(StreamWrite/StreamReader)

C# 在使用 StreamWriter 时得到空的 .txt