C# 流Stream详解(1)——读写txt和二进制文件

这篇具有很好参考价值的文章主要介绍了C# 流Stream详解(1)——读写txt和二进制文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【读写txt文件】

电脑手机上有各种各样的文件,例如视频文件、图片文件、文本文件,其中读写txt文件是最简单的,有多种方式,

使用StreamReader和StreamWriter

//读取文件
string path = @"C:\example.txt"; // 文件路径
using (StreamReader reader = new StreamReader(path))//使用using语句来确保资源被正确释放,以避免资源泄漏
{
    string line;
    while ((line = reader.ReadLine()) != null) // 逐行读取文件内容,每次读取一行,读取到末尾的时候为空
    {
        Console.WriteLine(line); // 输出每行内容到控制台
    }
}

//写入文件
string path = @"C:\example.txt"; // 文件路径
using (StreamWriter writer = new StreamWriter(path))
{
    string content = "Hello, World!"; // 要写入文件的内容
    writer.WriteLine(content); // 写入一行内容到文件
}

使用TextReader和TextWriter 

//读取文件
string path = @"C:\example.txt"; // 文件路径
using (TextReader reader = new StreamReader(path))
{
    string line;
    while ((line = reader.ReadLine()) != null) // 逐行读取文件内容
    {
        Console.WriteLine(line); // 输出每行内容到控制台
    }
}

//写入文件
string path = @"C:\example.txt"; // 文件路径
using (TextReader reader = new StreamReader(path))
{
    string line;
    while ((line = reader.ReadLine()) != null) // 逐行读取文件内容
    {
        Console.WriteLine(line); // 输出每行内容到控制台
    }
}

 使用FileStream

//读取文件
string path = @"C:\example.txt"; // 文件路径
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
    using (StreamReader reader = new StreamReader(fs))
    {
        string line;
        while ((line = reader.ReadLine()) != null) // 逐行读取文件内容
        {
            Console.WriteLine(line); // 输出每行内容到控制台
        }
    }
}


//写入文件
string path = @"C:\example.txt"; // 文件路径
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
    using (StreamWriter writer = new StreamWriter(fs))
    {
        string content = "Hello, World!"; // 要写入文件的内容
        writer.WriteLine(content); // 写入一行内容到文件
    }
}

使用File类提供的静态方法

上面几种方法代码都很长,一般来说我们几乎不会使用这些方法,使用File类提供的静态方法更便捷一些。如果文件非常大,还是要用上面的方法读文件,否则一次性读进来,内存会爆。

如果期望追加写入,还是要用上面的方法,StreamWriter的参数设置为true就好,例如StreamWriter sw = new StreamWriter(filePath, true);

//读取文件
string path = @"C:\example.txt"; // 文件路径
string content = File.ReadAllText(path); // 读取整个文件内容
Console.WriteLine(content); // 输出文件内容到控制台

//写入文件
string path = @"C:\example.txt"; // 文件路径
string content = "Hello, World!"; // 要写入文件的内容
File.WriteAllText(path, content); // 将内容写入文件

//上面是一次性读取写入,得到的对象是一个非常大的string,但有时我们需要逐行处理,就要逐行读取写入
string path = @"C:\example.txt"; // 文件路径
string[] lines = File.ReadAllLines(path); // 读取所有行
foreach (string line in lines)
{
    Console.WriteLine(line); // 在控制台输出每一行
}

string path = @"C:\example.txt"; // 文件路径
string[] lines = { "第一行内容", "第二行内容", "第三行内容" }; // 字符串数组,每个元素将成为一行
File.WriteAllLines(path, lines); // 将字符串数组中的所有元素写入到文件中

文本编码

如果读出来的内容是乱码,建议了解文本编码,在读取和写入文本时都可以传递文本编码参数。

【读写二进制文件】 

使用BinaryWriter和BinaryReader

我们知道在磁盘上只会存储二进制数据,文本文件最后也会被保存为二进制文件,我们调用接口读取和写入时虽然用的是string,但到底层一定是byte[]。这就涉及到string到byte[]的编码和byte[]到string的解码,只不过对于文本文件而言,有确定的编码解码规则,我们不需要关心。

而读写二进制文件,需要你自己设置编码解码规则。编码解码的类型不止是string,可能是各种类型的。

//写入文件
using (BinaryWriter writer = new BinaryWriter(File.Open("file.bytes", FileMode.Create)))
{    
    bool boolValue = true;
    writer.Write(boolValue);

    int intValue = 123;
    writer.Write(intValue);

    float floatValue = 3.14f;
    writer.Write(floatValue);

    double doubleValue = 3.1415926;
    writer.Write(doubleValue);

    char charValue = 'A';
    writer.Write(charValue);

    string content = "永恒之星";
    byte[] bytes = Encoding.UTF8.GetBytes(content);
    writer.Write(bytes.Length); // 写入字符串长度
    writer.Write(bytes); // 写入字符串字节数组
}

 读取文件时按照写入的顺序一个个读取即可。

//读取文件
        using (BinaryReader reader = new BinaryReader(File.Open("file.bytes", FileMode.Open)))
        {
            bool boolValue = reader.ReadBoolean();
            Debug.Log(boolValue);

            int intValue = reader.ReadInt32();
            Debug.Log(intValue);

            float floatValue = reader.ReadSingle();
            Debug.Log(floatValue);

            double doubleValue = reader.ReadDouble();
            Debug.Log(doubleValue);

            char charValue = reader.ReadChar();
            Debug.Log(charValue);

            int length = reader.ReadInt32();
            byte[] bytes = reader.ReadBytes(length);
            string content = Encoding.UTF8.GetString(bytes);
            Debug.Log(content);
        }

使用MemoryStream

上面的问题在于是一次次读写的,会有多次IO开销,可以借助MemoryStream将文件内容先一次性读写到内存中,然后再读写到磁盘中。

另外,我们读写数据时是一行行代码读写的,如果有一万个数据,当然不可能写一万行代码,所以对同类型的数据需要将数据个数也写入,用for循环减少代码量。

        //写入文件
        using (MemoryStream ms = new MemoryStream())
        {
            using (BinaryWriter writer = new BinaryWriter(ms))
            {

                bool boolValue = true;
                writer.Write(boolValue);

                int count = 5;
                writer.Write(count);
                for (int i = 0; i < count; i++)
                {
                    int intValue = 123;
                    writer.Write(intValue);
                }

                float floatValue = 3.14f;
                writer.Write(floatValue);

                double doubleValue = 3.1415926;
                writer.Write(doubleValue);

                char charValue = 'A';
                writer.Write(charValue);

                string content = "永恒之星";
                byte[] bytes = Encoding.UTF8.GetBytes(content);
                writer.Write(bytes.Length); // 写入字符串长度
                writer.Write(bytes); // 写入字符串字节数组
            }
            File.WriteAllBytes("file.bytes", ms.ToArray());//一次性写入磁盘
        }

        //读取文件
        using (MemoryStream ms = new MemoryStream(File.ReadAllBytes("file.bytes")))//一次性从磁盘读取数据
        {
            using (BinaryReader reader = new BinaryReader(ms))
            {
                bool boolValue = reader.ReadBoolean();
                Debug.Log(boolValue);

                int count = reader.ReadInt32();
                for (int i = 0; i < count; i++)
                {
                    int intValue = reader.ReadInt32();
                    Debug.Log(intValue);
                }

                float floatValue = reader.ReadSingle();
                Debug.Log(floatValue);

                double doubleValue = reader.ReadDouble();
                Debug.Log(doubleValue);

                char charValue = reader.ReadChar();
                Debug.Log(charValue);

                int length = reader.ReadInt32();
                byte[] bytes = reader.ReadBytes(length);
                string content = Encoding.UTF8.GetString(bytes);
                Debug.Log(content);
            }
        }

拓展

如果我们有很多不同类型的数据需要写到不同的二进制文件中,而且后期的数据结构还可能会修改,那么每次自己读写就非常繁琐,维护成本很高。我们需要借助些序列化工具帮忙读写,我们只需要定义好数据结构,并填充数据即可。这些工具有BinaryFomatter、ProtoBuf、FlatBuffer,更具需求选择合理的工具。文章来源地址https://www.toymoban.com/news/detail-740880.html

到了这里,关于C# 流Stream详解(1)——读写txt和二进制文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++文件操作基础 读写文本、二进制文件 输入输出流 文件位置指针以及随机存取 文件缓冲区以及流状态

    文本文件一般以行的形式组织数据。 包含头文件: #include fstream 类: ofstream(output file stream) ofstream 打开文件的模式(方式):类内open()成员函数参数2.参数1是文件存储/创建路径 例如:fout.open(filename,ios::app); 对于 ofstream,不管用哪种模式打开文件,如果文件不存在,都会创

    2024年01月25日
    浏览(39)
  • 【FPGA仿真】Matlab生成二进制、十六进制的txt数据以及Vivado读取二进制、十六进制数据并将结果以txt格式保存

    在使用Vivado软件进行Verilog程序仿真时可能需要对模块输入仿真的数据,因此我们需要一个产生数据的方法(二进制或者十六进制的数据),Matlab软件是一个很好的工具,当然你也可以使用VS等工具。 以下分别给出了使用Matlab模拟产生二进制和十六进制数据的例子,例子仅供参

    2024年02月01日
    浏览(37)
  • 07-2_Qt 5.9 C++开发指南_二进制文件读写(stm和dat格式)

    除了文本文件之外,其他需要按照一定的格式定义读写的文件都称为二进制文件 。每种格式的二进制文件都有自己的格式定义,写入数据时按照一定的顺序写入,读出时也按照相应的顺序读出。例如地球物理中常用的 SEG-Y 格式文件,必须按照其标准格式要求写入数据才符合

    2024年02月13日
    浏览(31)
  • C#蓝牙连接及传输数据的三种方式(蓝牙传输文件、二进制数据)

          先下载InTheHand.Net.Personal.dll并在C#中引用,这个需要在网上下载      先看界面            这种方式优点是稳定性较强,基本无错误,就是偶尔需要提前蓝牙配对。        这种方式直接与蓝牙设备进行配对的时候会报错,请求的地址无效,这时候需要在被检测的蓝牙

    2024年02月11日
    浏览(62)
  • 【嵌入式烧录/刷写文件】-3.1-详解二进制Bin格式文件

    目录 1 什么是bin 2 bin文件的结构 3 如何打开bin文件 3.1 使用Vector HexView工具打开 3.2 使用Notepad++工具打开 3.3 使用Binary Viewer工具打开 结尾 优质博文推荐阅读(单击下方链接,即可跳转): 点击返回「《Autosar从入门到精通-实战篇》总目录」 点击返回「《Autosar_BSW高阶配置》总

    2024年02月08日
    浏览(34)
  • linux二进制文件分析三大工具详解(ldd、readelf、nm)

    测试代码源码、源码如下: 编译命令 ldd 是 Linux 下的一个命令,用于查看可执行文件或共享库文件的动态链接库依赖关系。通过 ldd 命令,你可以确定一个可执行文件或共享库文件所依赖的动态链接库(也就是它们在运行时需要加载的库文件)。 OPTIONS(可选) : ldd 命令支

    2024年02月06日
    浏览(39)
  • C# 颠倒二进制位

    颠倒给定的 32 位无符号整数的二进制位。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。 在

    2024年02月16日
    浏览(49)
  • C语言--文件操作详解(2)(文本文件和二进制文件,文件读取结束的判定,用函数进行文件的拷贝,文件缓冲区)

    本篇文章主要介绍了文本文件和二进制文件,文件读取结束的判定,如何使用函数进行文件的拷贝,文件缓冲区的相关知识。 以及具有保存功能的八功能通讯录的源码。 据数据的组织形式,数据文件被称为文本文件或者二进制文件。 ①数据在内存中以二进制的形式存储,如

    2024年02月08日
    浏览(38)
  • C# 二进制字节流查找函数IndexOf

    /// summary  /// 报告指定的 System.Byte[] 在此实例中的第一个匹配项的索引。  /// /summary  /// param name=\\\"srcBytes\\\"被执行查找的 System.Byte[]。/param  /// param name=\\\"searchBytes\\\"要查找的 System.Byte[]。/param  /// returns如果找到该字节数组,则为 searchBytes 的索引位置;如果未找到该字节数组,则

    2024年02月13日
    浏览(37)
  • 将数据转二进制流文件,用PostMan发送二进制流请求

    一、将byte数组转二进制流文件,并保存到本地 byte [] oneshotBytes=new byte[]{78,-29,51,-125,86,-105,56,82,-94,-115,-22,-105,0,-45,-48,-114,27,13,38,45,-24,-15,-13,46,88,-90,-66,-29,52,-23,40,-2,116,2,-115,17,36,15,-84,88,-72,22,-86,41,-90,-19,-58,19,99,-4,-63,29,51,-69,117,-120,121,3,-103,-75,44,64,-58,-34,73,-22,110,-90,92,-35,-18,-128,16,-

    2024年02月15日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包