我有点困惑于StreamReader类的两个不同的构造函数,即
1.StreamReader(Stream)
我知道它以流字节作为输入,但各自的输出是相同的。
下面是我使用StreamReader(流)结构器编写的代码
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 filepath=@"C:\Users\Suchit\Desktop\p022_names.txt";
using (StreamReader sw = new StreamReader(filePath))
{
while(!sw.EndOfStream)
{
Console.WriteLine(sw.ReadLine());
}
}那么哪一个更好?我们应该何时何地使用各自的代码,从而使我们的代码变得更加优化和可读性?
发布于 2015-08-07 06:50:50
类StreamReader (以及StreamWriter)只是FileStream的包装器,它需要一个FileStream来读取/写入文件。
因此,基本上您有两个选项(ctor重载):
考虑一下这种情况:
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");
}
}
}读者和作家都有着相同的作品。现在,如果我们将其改为:
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");
}
}System.IOException被抛出“进程无法访问文件C:\Temp\1.pb,因为它正被另一个进程使用……这是因为我们尝试用FileStream2打开文件,而我们仍然在FileStream1中使用它。所以一般来说,如果您想打开文件,执行一个r/w操作并关闭它,您可以使用StreamReader(string)重载。如果您希望在多个操作中使用相同的FileStream,或者出于任何其他原因,您希望对Filestream拥有更多的控制权,那么您应该先实例化它,然后传递给StreamReader(fs)。
发布于 2015-08-07 06:52:19
哪一个更好?
没有。两者是一样的。顾名思义,StreamReader用于处理流;当您使用"path“创建StreamReader实例时,它将在内部创建FileStream。
我们应该在何时何地使用各自的代码
当您预先使用Stream时,请使用重载,否则需要一个Stream“路径”。
使用Stream重载的一个优点是可以根据需要配置FileStream。例如,如果要使用异步方法,则需要以异步模式打开文件。如果你不那么做,操作将不是真正的异步操作。。
当有疑问时,请自己检查来源。
发布于 2015-08-07 07:49:28
注意,Stream重载不需要FileStream。这允许您从Stream的任何子类读取数据,这允许您进行诸如读取web请求的结果、读取解压缩数据或读取解密数据等操作。
如果您只想从文件中读取并且不需要将string path用于其他任何事情,则使用FileStream重载。它只会帮助您避免编写一行代码:
using (var stream = File.OpenRead(path))
using (var reader = new StreamReader(stream))
{
...
}File.OpenText也做了同样的事情。
https://stackoverflow.com/questions/31871193
复制相似问题