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(string filepath)和StreamReader(Stream _stream)的区

StreamReader(以及StreamWriter)只是一个包装器FileStream,它需要一个FileStream来读写文件

基本上你有两个选项(函数重载):

  1. 自己显式地创建FileStream并在其周围包装SR
  2. 让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)可以被认为是在您可以通过编程访问文件的情况下的后备方案,但它的路径很难确定。