首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StreamReader(string filepath)和StreamReader(Stream _stream)的区别

StreamReader(string filepath)和StreamReader(Stream _stream)的区别
EN

Stack Overflow用户
提问于 2015-08-07 06:37:40
回答 7查看 3.4K关注 0票数 3

我有点困惑于StreamReader类的两个不同的构造函数,即

1.StreamReader(Stream)

我知道它以流字节作为输入,但各自的输出是相同的。

下面是我使用StreamReader(流)结构器编写的代码

代码语言:javascript
复制
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)

代码语言:javascript
复制
This conrtuctor takes the physical file path,
where our respective file   exists but the output is again same.

下面是我使用StreamReader(字符串)的代码

代码语言:javascript
复制
string filepath=@"C:\Users\Suchit\Desktop\p022_names.txt";
using (StreamReader sw = new StreamReader(filePath))
{
     while(!sw.EndOfStream)
     {
         Console.WriteLine(sw.ReadLine());
     }
}

那么哪一个更好?我们应该何时何地使用各自的代码,从而使我们的代码变得更加优化和可读性?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-08-07 06:50:50

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

因此,基本上您有两个选项(ctor重载):

  1. 自己显式地创建FileStream并围绕它包装SR
  2. 让SR为您创建FileStream

考虑一下这种情况:

代码语言:javascript
复制
        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");
                }
            }
        }

读者和作家都有着相同的作品。现在,如果我们将其改为:

代码语言:javascript
复制
        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)

票数 4
EN

Stack Overflow用户

发布于 2015-08-07 06:52:19

哪一个更好?

没有。两者是一样的。顾名思义,StreamReader用于处理流;当您使用"path“创建StreamReader实例时,它将在内部创建FileStream

我们应该在何时何地使用各自的代码

当您预先使用Stream时,请使用重载,否则需要一个Stream“路径”。

使用Stream重载的一个优点是可以根据需要配置FileStream。例如,如果要使用异步方法,则需要以异步模式打开文件。如果你不那么做,操作将不是真正的异步操作。

当有疑问时,请自己检查来源

票数 1
EN

Stack Overflow用户

发布于 2015-08-07 07:49:28

注意,Stream重载不需要FileStream。这允许您从Stream的任何子类读取数据,这允许您进行诸如读取web请求的结果、读取解压缩数据或读取解密数据等操作。

如果您只想从文件中读取并且不需要将string path用于其他任何事情,则使用FileStream重载。它只会帮助您避免编写一行代码:

代码语言:javascript
复制
using (var stream = File.OpenRead(path))
using (var reader = new StreamReader(stream))
{
    ...
}

File.OpenText也做了同样的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31871193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档