StreamReader(string filepath)和StreamReader(Stream _stream)的区
本文关键字:StreamReader stream 的区 filepath string Stream | 更新日期: 2023-09-27 18:06:44
我有点混淆StreamReader类的两个不同构造函数,即
1. streamreader(流)
我知道它以流字节作为输入,但各自的输出是相同的。
下面是我使用StreamReader(Stream)构造函数的代码string filepath=@"C:'Users'Suchit'Desktop'p022_names.txt";
using(FileStream fs = new FileStream(filepath,FileMode.Open,FileAccess.Read))
{
using(StreamReader sw = new StreamReader(fs))
{
while(!sw.EndOfStream)
{
Console.WriteLine(sw.ReadLine());
}
}
}
2。StreamReader (String)
This conrtuctor takes the physical file path,
where our respective file exists but the output is again same.
下面是我使用StreamReader(String)
的代码string filepath=@"C:'Users'Suchit'Desktop'p022_names.txt";
using (StreamReader sw = new StreamReader(filePath))
{
while(!sw.EndOfStream)
{
Console.WriteLine(sw.ReadLine());
}
}
那么,哪个更好呢?何时何地我们应该使用相应的代码,从而使我们的代码变得更加优化和可读?
类StreamReader
(以及StreamWriter
)只是一个包装器FileStream
,它需要一个FileStream来读写文件
基本上你有两个选项(函数重载):
- 自己显式地创建FileStream并在其周围包装SR
- 让SR为您创建FileStream
考虑这个场景:
using (FileStream fs = File.Open(@"C:'Temp'1.pb", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
using (StreamReader reader = new StreamReader(fs))
{
// ... read something
reader.ReadLine();
using (StreamWriter writer = new StreamWriter(fs))
{
// ... write something
writer.WriteLine("hello");
}
}
}
reader和writer都在同一个文件流上工作。现在如果我们把它改成:
using (StreamReader reader = new StreamReader(@"C:'Temp'1.pb"))
{
// ... read something
reader.ReadLine();
using (StreamWriter writer = new StreamWriter(@"C:'Temp'1.pb"))
{
// ... write something
writer.WriteLine("hello");
}
}
系统。进程无法访问文件C:'Temp'1。Pb,因为它正在被另一个进程使用……这是因为我们尝试用FileStream2打开文件,而我们仍然在FileStream1中使用它。所以一般来说,如果你想打开文件,执行一个r/w操作,并关闭它,你可以与StreamReader(string)
过载。如果您想使用相同的FileStream
进行多个操作,或者由于任何其他原因,您希望对Filestream有更多的控制,那么您应该首先实例化它并传递给StreamReader(fs)
。
哪个更好?
。两者是一样的。顾名思义,StreamReader
用于处理流;当你用"path"创建一个StreamReader实例时,它会在内部创建FileStream
。
何时何地应该使用相应的代码
当你在前面有Stream
时,使用超载,它接受Stream
,否则是"路径"。
使用Stream
过载的一个优点是您可以根据需要配置FileStream
。例如,如果要使用异步方法,则需要使用异步模式打开文件。如果你不这样做,那么操作将不是真正的异步。
当你有疑问的时候,不要犹豫,自己去查出处。
注意,Stream
重载不接受FileStream
。这允许你从Stream
的任何子类中读取数据,它允许你做一些事情,比如读取web请求的结果,读取未压缩的数据,或者读取解密的数据。
使用string path
重载,如果你只想从一个文件中读取,你不需要使用FileStream
为任何其他。它只是节省了您编写一行代码:
using (var stream = File.OpenRead(path))
using (var reader = new StreamReader(stream))
{
...
}
File.OpenText
也做同样的事情。
两者是相同的,只是重载,根据您的需要使用其中一个。如果你有一个本地文件那么你可以使用StreamReader(string path)
否则如果你只是从网上或其他来源的流那么其他重载也可以帮助你-e StreamReader(Stream stream)
在搜索了新的开源参考资料之后。你可以看到后者在内部扩展到前者。因此,将原始文件路径传递给StreamReader
将使他在内部将其扩展为FileStream
。对我来说,这意味着两者是等价的,你可以根据自己的喜好使用它们。
我个人的意见是使用后者,因为它编写的代码更少,而且更明确。我不喜欢java的处理方式比如千字节读取器,流读取器,输出读取器等等
基本上两者的工作原理相同,即做 utf8encoding 并使用 1024字节的缓冲区。但是 StreamReader对象在提供的Stream对象上调用Dispose()。调用Dispose。
可以引用下面的Stream和String
您可以根据手头的流或字符串文件路径使用它们中的任何一个。
StreamReader(string)只是StreamReader(Stream)的重载。
在你的问题的上下文中,你可能最好使用StreamReader(string)重载,因为它意味着更少的代码。StreamReader(Stream)可能会快得多,但是你必须使用你可以直接放入StreamReader的字符串来创建一个FileStream,所以你获得的任何好处都失去了。
基本上,StreamReader(string)适用于具有静态或易于映射路径的文件(就像您的情况一样),而StreamReader(Stream)可以被认为是在您可以通过编程访问文件的情况下的后备方案,但它的路径很难确定。