Logo

C#如何读取文件内容?(FileStream与StreamReader区别)

photo

2022年06月05日

 在C#中读取文件内容,有两个类可以做到,一个是StreamReader类,一个是FileStream类。那么究竟如何实现?以及他们两个有什么区别?在今后应用中应该使用哪一个?别着急,我一个个来说!


目录

1.开门见山谈区别

2.FileStream

3.StreamReader

4.注意事项

4.1.及时释放

 4.2.异步操作

4.3汉字乱码

5.总结:

6.参考文献:


1.开门见山谈区别

FileStream类提供了在文件中读写字节的方法,但经常使用StreamReader或 StreamWriter执行这些功能。这是因为FileStream类操作的是字节和字节数组,而StreamReader类操作的是字符数据。因此FileStream类既可以对文本文件进行读写也可以对多媒体文件进行读写,多用于对大文件进行读写,且它对文件可进行分步读写,减小内存压力。而StreamReader和StreamWriter类多用于对小文件读写。

FileStream操作字节,更适合大文件。

StreamReader操作字符,更适合小文件。

2.FileStream

 用FileStream操作文件的方法代码如下:

using System;
using System.IO;
using System.Text;

class Test
{

    public static void Main()
    {
        string path = @"c:\temp\MyTest.txt";

        //如果文件存在就删除
        if (File.Exists(path))
        {
            File.Delete(path);
        }

        //创建新文件
        using (FileStream fs = File.Create(path))
        {
            AddText(fs, "This is some text");
            AddText(fs, "This is some more text,");
            AddText(fs, "\r\nand this is on a new line");
            AddText(fs, "\r\n\r\nThe following is a subset of characters:\r\n");

            for (int i=1;i < 120;i++)
            {
                AddText(fs, Convert.ToChar(i).ToString());
            }
        }

        //读取文件内容
        using (FileStream fs = File.OpenRead(path))
        {
            byte[] b = new byte[1024];
            UTF8Encoding temp = new UTF8Encoding(true);
            while (fs.Read(b,0,b.Length) > 0)
            {
                Console.WriteLine(temp.GetString(b));
            }
        }
    }
    //添加文本内容的方法
    private static void AddText(FileStream fs, string value)
    {
        byte[] info = new UTF8Encoding(true).GetBytes(value);
        fs.Write(info, 0, info.Length);
    }
}

3.StreamReader

 用StreamReader操作文件的方法代码如下:

using System;
using System.IO;

class Test
{
    public static void Main()
    {
        try
        {
            // 读取文本文件
            using (StreamReader sr = new StreamReader("TestFile.txt"))
            {
                string line;
                // ReadLine()一行一行的循环读取
                //当然可以直接ReadToEnd()读到最后
                while ((line = sr.ReadLine()) != null)
                {
                    Console.WriteLine(line);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
}

4.注意事项

4.1.及时释放

这两种类型使用完毕后都需要对其进行释放!具体说明看下图:

 4.2.异步操作

如果读取的文件内容过大,时间过长,导致界面卡死,那么可以采用两个办法:

①开线程

②利用异步

具体请看文末参考文献。

4.3汉字乱码

编码:gb2312可以保证汉字不出现乱码:

请看我的使用:

(StreamReader)

(FileStream)

 

5.总结:

我们正常操作文件的时候,比如office文件或者txt文本文件,那么使用相对简便的StreamReader就足够了。如果读取音视频文件,那么就要考虑FileStream了!

6.参考文献:

FileStream 类 (System.IO) | Microsoft Docs

StreamReader 类 (System.IO) | Microsoft Docs

https://blog.csdn.net/Hellen0708/article/details/86234801

本文为原创文章,请注意保留出处!
C#中的UrlEncode 2022年06月05日

右击项目==》添加引用==》.NET==》System.Web==》确定System.Web.Ht...C#中的UrlEncode

热门文章

修复群晖Synology Drive client右键菜单缺失问题 本教程主要解决windows10右键菜单中没有SynologyDrive菜单的问题,整体思路是找到...修复群晖SynologyDriveclient右键菜单缺失问题 作者:Pastore Antonio
1825 浏览量
docker如何查看一个镜像内部的目录结构及其内部都有哪些文件 前言:有时候我们会在docker上下载一个镜像,或者是上传一个镜像到docker上,甚至有时候就是在...docker如何查看一个镜像内部的目录结构及其内部都有哪些文件 作者:Pastore Antonio
1807 浏览量
Adobe Acrobat Pro 激活 这里记录了一些AdobeAcrobat的激活教程和组件。浏览量:1,687 作者:Pastore Antonio
1534 浏览量
configure: error: Package requirements (oniguruma) were not met configure:error:Packagerequirements(oniguruma)...configure:error:Packagerequirements(oniguruma)werenotmet 作者:Pastore Antonio
1534 浏览量
追寻日出,找回自己 为什么我要去追寻日出?其实我是一个很懒的人,每次都起不来,直到有一次我在租房中睡到了大天亮,阳光照...追寻日出,找回自己 作者:Pastore Antonio
1514 浏览量