0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是I/O?

汽车电子技术 来源:程序猿知秋 作者:程序猿知秋 2023-01-20 17:16 次阅读

什么是I/O?

  • I/O 的全称是input/output,即输入和输入设备,常见的输入设备有:键盘、鼠标,输出设备则比如 显示器、音响 这样的。
  • 对程序而言,IO就是与外面数据交换的方式, 数据向程序里面录入就是 输入,从程序往流出就是 输出
  • IO在程序中的作用就是将数据转换成 字节,然后进行交互

流(Stream)

C#中,所有流都是继承自Stream类,Stream类定义了流应该具有的行为和属性,使得开发人员可以忽略底层的操作系统和基础设备的具体细节。C#对流的处理忽略了读流和写流的区别,使其更像是一个管道,方便数据通信

流涉及到三个基本操作:

  • 读取 - 将数据从流中传输到数据结构中
  • 写入 - 将数据从数据源写入流中
  • 查找 - 对流中操作的当前位置进行查找和修改

因为流的特性,可能并不是所有的流都支持这三种操作,所以Stream提供了三个属性,以方便确认流是否支持这三种操作:

  • public abstract bool CanRead { get; } // 获取指示当前流是否支持读取的值
  • public abstract bool CanWrite { get; } // 获取指示当前流是否支持写入功能的值
  • public abstract bool CanSeek { get; } // 获取指示当前流是否支持查找功能的值

**以上这三个属性均由子类根据自身特性确认是否支持读取、写入、查找,可能三个属性不会都为true,但绝对不会都为false。
**

读写类

  • 字节流
    • BinaryReader和BinaryWriter
    • 字节流用来处理,人看不懂的内容,如图片、视频等文件用文本打开看不懂的内容
  • 字符流
    • TextReader和TextWriter
      • ****StreamReader和StreamWriter
      • StringReader和StringWriter
    • **用来处理人能看懂的内容,用文本打开能看懂的内容,如:自己写的各种文本内容
      **

常见的IO类

System.IO 命名空间有各种不同的类,用于执行各种文件操作,如创建和删除文件、读取或写入文件,关闭文件等

I/O 类 描述
BinaryReader 从二进制流读取原始数据。
BinaryWriter 以二进制格式写入原始数据。
BufferedStream 字节流的临时存储。
Directory 有助于操作目录结构。
DirectoryInfo 用于对目录执行操作。
DriveInfo 提供驱动器信息
File 有助于处理文件。
FileInfo 用于对文件执行操作。
FileStream 用于文件中任何位置的读写。
MemoryStream 用于随机访问存储在内存中的数据流。
Path 对路径信息执行操作。
StreamReader 用于从字节流中读取字符。
StreamWriter 用于向一个流中写入字符。
StringReader 用于读取字符串缓冲区。
StringWriter 用于写入字符串缓冲区。

FileStream 类

用FileStream来创建或读取一个文件对象,语法如下:

FileStream <object_name> = new FileStream( <file_name>,
<FileMode Enumerator>, <FileAccess Enumerator>, <FileShare Enumerator>);

**如下,读取aa.txt文件的内容
**

FileStream fileStream = new FileStream(@"D:\\c#workspace\\练习\\aa.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
参数 描述
FileMode FileMode 枚举定义了各种打开文件的方法。FileMode 枚举的成员有:Append:打开一个已有的文件,并将光标放置在文件的末尾。如果文件不存在,则创建文件。Create:创建一个新的文件。如果文件已存在,则删除旧文件,然后创建新文件。CreateNew:指定操作系统应创建一个新的文件。如果文件已存在,则抛出异常。Open:打开一个已有的文件。如果文件不存在,则抛出异常。OpenOrCreate:指定操作系统应打开一个已有的文件。如果文件不存在,则用指定的名称创建一个新的文件打开。Truncate:打开一个已有的文件,文件一旦打开,就将被截断为零字节大小。然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期。如果文件不存在,则抛出异常。
FileAccess FileAccess 枚举的成员有:Read、ReadWrite和Write。
FileShare FileShare枚举的成员有:Inheritable:允许文件句柄可由子进程继承。Win32 不直接支持此功能。None:谢绝共享当前文件。文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。Read:允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。ReadWrite:允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。Write:允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。Delete:允许随后删除文件。

使用示例

public static void Main()
{
    // 定义文件流
    FileStream fileStream = new FileStream(@"D:\\c#workspace\\练习\\aa.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
   
    for (int i = 1; i <= 20; i++)
    {
        fileStream.WriteByte((byte)i);
    }


    // 文件开头开始读取
    fileStream.Position = 0;
    for (int i = 0; i <= 20; i++)
    {
        Console.Write(fileStream.ReadByte() + " ");
    }
    //关闭流
    fileStream.Close();
    Console.ReadKey();
}

**输出结果如下:
**

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -1

字符流 StreamReader 和 StreamWriter 类

用于文本文件的数据读写。这些类从抽象基类 Stream 继承,Stream 支持文件流的字节读写

读写文件案例

static void test2()
{
    // 定义一个streamWriter写一个文件
    string[] nameArray = { "张三", "李四", "王五" };
    // 使用using,用完后能自动关流
    using(StreamWriter sw=new StreamWriter(@"D:\\c#workspace\\练习\\aa.txt"))
    {
        foreach(string str in nameArray)
        {
            // 一次写一行
            sw.WriteLine(str);
        }
    }




    // 读取刚写入的文件
    using(StreamReader sr=new StreamReader(@"D:\\c#workspace\\练习\\aa.txt"))
    {
        string line;
        // 当值为null,说明已经读完了文件
        while ((line =sr.ReadLine())!= null)
        {
            Console.WriteLine(line);
        }
    }


}

输出结果

张三
李四
王五

字节流 BinaryReader 和 BinaryWriter 类用于二进制文件的读写

复制图片案例

static void test3()
{
    // 复制图片


    byte[] imgArray = null;
    //先读取原图
    FileStream fs = new FileStream(@"D:\\c#workspace\\练习\\img\\1.jpg", FileMode.Open);
    using(BinaryReader br=new BinaryReader(fs))
    {
        imgArray = br.ReadBytes((int)fs.Length);
    }




    // 生成一个新的图片
    FileStream fs2 = new FileStream(@"D:\\c#workspace\\练习\\img\\aaa.jpg", FileMode.Create);
    using (BinaryWriter bw = new BinaryWriter(fs2))
    {
        bw.Write(imgArray);
    }


}

Windows 文件系统的操作

C# 允许您使用各种目录和文件相关的类来操作目录和文件,比如 DirectoryInfo 类和 FileInfo 类。

  • DirectoryInfo 类派生自 FileSystemInfo 类。它提供了各种用于创建、移动、浏览目录和子目录的方法。该类不能被继承
  • FileInfo 类派生自 FileSystemInfo 类。它提供了用于创建、复制、删除、移动、打开文件的属性和方法,且有助于 FileStream 对象的创建。该类不能被继承

读取指定目录下的所有文件列表案例

static void test4()
{
    // 创建一个 DirectoryInfo 对象
    DirectoryInfo mydir = new DirectoryInfo(@"D:\\c#workspace\\练习");


    // 获取目录中的文件以及它们的名称和大小
    FileInfo[] f = mydir.GetFiles();
    foreach (FileInfo file in f)
    {
        Console.WriteLine("File Name: {0} Size: {1}",
            file.Name, file.Length);
    }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 输入设备
    +关注

    关注

    0

    文章

    23

    浏览量

    8485
  • i/o
    i/o
    +关注

    关注

    0

    文章

    33

    浏览量

    4569
  • 输出设备
    +关注

    关注

    0

    文章

    10

    浏览量

    2068
收藏 人收藏

    评论

    相关推荐

    I/O电路中电压比较器与I/O信号完整性介绍

    在高速I/O电路设计中,输入I/O的比较器是一个非常重要的模块。
    的头像 发表于 10-30 15:02 1603次阅读
    <b class='flag-5'>I</b>/<b class='flag-5'>O</b>电路中电压比较器与<b class='flag-5'>I</b>/<b class='flag-5'>O</b>信号完整性介绍

    物理约束实践:I/O约束

    I/O约束(I/O Constraints)包括I/O标准(
    的头像 发表于 11-18 16:42 1046次阅读
    物理约束实践:<b class='flag-5'>I</b>/<b class='flag-5'>O</b>约束

    数字I/O介绍

    数字I/O脚有专用和复用。数字I/O脚的功能通过9个16位控制寄存器来控制。控制寄存器分为两类:(1)I/
    发表于 09-16 12:20 19次下载

    冗余I/O

    6.1 冗余I/O的定义当I/O模块以每两个一组组态成冗余对运行时,I/O模板即认为是冗余配置。
    发表于 07-23 00:29 26次下载

    基于Rocket I/O模块的高速I/O设计

    摘要: 介绍了采用Videx-ⅡPR0系列FPCA设计的应用于下一代无线通信系统中的高速IO。由于充分利用芯片中集成的Rocket IO模块,并采用差分输入参考时钟、
    发表于 06-20 10:45 1329次阅读
    基于Rocket <b class='flag-5'>I</b>/<b class='flag-5'>O</b>模块的高速<b class='flag-5'>I</b>/<b class='flag-5'>O</b>设计

    什么是I/O地址

    什么是I/O地址 I/O地址中I是input的简写,O是output的简写,也就是输入输出地址
    发表于 02-05 10:01 1342次阅读

    I/O扩展(8255)模块

    为用户在中提供一个I/O 扩展的方法,在设计过程遇到I/O不够用时可以用此种方案。
    发表于 07-04 17:12 0次下载

    Java I/O 的相关方法分析

    I/O,即 Input/Output(输入/输出) 的简称。就 I/O 而言,概念上有 5 种模型:blocking I/
    发表于 09-27 13:18 0次下载
    Java <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 的相关方法分析

    介绍 I/O NI系统,C系列的I/O模块

    内容包括:理想的确定性以太网I/O,具有确定性分布式I/O的NI系统,C系列的I/O模块,与La
    的头像 发表于 06-14 06:19 4557次阅读
    介绍 <b class='flag-5'>I</b>/<b class='flag-5'>O</b> NI系统,C系列的<b class='flag-5'>I</b>/<b class='flag-5'>O</b>模块

    PLC的I/O模块如何选择

    一般IO模块的价格占PLC价格的一半以上。PLC的IO模块有开关量IO模块、模拟量
    发表于 05-19 08:54 9346次阅读
    PLC的<b class='flag-5'>I</b>/<b class='flag-5'>O</b>模块如何选择

    关于标准I/O库执行I/O操作

    当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符,但只有在写了一行之后才进行实际I/
    的头像 发表于 07-01 17:17 2358次阅读

    STM32单片机---I/O应用

    STM32单片机---(二)I/O应用stm32I/O简介GPIO的8种工作模式stm32I/O
    发表于 12-17 18:33 18次下载
    STM32单片机---<b class='flag-5'>I</b>/<b class='flag-5'>O</b>应用

    Linux I/O 接口的类型及处理流程

    Linux I/O 接口 Linux I/O 接口可以分为以下几种类型: 文件 I/O 接口:用
    的头像 发表于 11-08 16:43 877次阅读
    Linux <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 接口的类型及处理流程

    FANUC外部I/O点数不够用了怎么办?可以扩展I/O点数吗?

    FANUC外部I/O点数不够用了怎么办?可以扩展I/O点数吗? 扩展FANUC的外部I/O点数是
    的头像 发表于 02-18 15:21 1692次阅读

    直接I/O

    电子发烧友网站提供《直接I/O库.pdf》资料免费下载
    发表于 10-14 10:55 0次下载
    直接<b class='flag-5'>I</b>/<b class='flag-5'>O</b>库