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

    文章

    19

    浏览量

    8425
  • i/o
    i/o
    +关注

    关注

    0

    文章

    33

    浏览量

    4524
  • 输出设备
    +关注

    关注

    0

    文章

    9

    浏览量

    2058
收藏 人收藏

    评论

    相关推荐

    I/O口状态切换说明

    對於普通雙向I/O 口,在位操作時出現狀態切換異常情況的分析說明:1) 普通I/O 口結構圖:結構圖2) 普通I/
    发表于 03-31 14:46

    8255 I/O扩展

    我用8255扩展51单片机的I/O口,A0、A1、CS分别接P2.0、P2.1、P2.7,虽然可以算出PA、PB、PC的地址,但需要对PA、PB、PC口中单独的I/O控制。能定义单独里
    发表于 03-12 11:26

    测量I/O

    测量I/O里面没有Data Acquision子选板,这是为什么?请大神指导!
    发表于 07-04 15:02

    I/O模块无法识别

    我已经成功地编程了CyPress I/O模块,但是当我进入驱动站时,诊断标签中的I/O LED不会变成绿色。 以上来自于百度翻译 以下为原文I
    发表于 01-09 14:11

    如何TRIS未使用的I/O引脚

    大家好,我使用PIC18F4620 40PIN DIP封装,大约30的I/O引脚没有使用。我不知道我应该把它们留在硬件中,还是应该把它们绑定到VDD或VSS?在软件中也推荐使用未使用的I/O
    发表于 01-25 14:33

    如何配置CML I / O标准?

    你好Xilinx收发器使用CML IOSTANDARD。在xilinx 7系列示例设计中,有固定的GTREFCLK位置,但其他引脚未配置(txdata / rxdata)在下面的I / O表中,txdata和rxdata引脚未配置CML
    发表于 08-13 10:10

    请问AVR I/O怎么使用?

    AVR I/O的使用方法
    发表于 11-09 07:00

    I/O电源最初配置为准高时要多少下拉电阻才能保持I/O低?

    I/O电源最初配置为准高时,需要多少下拉电阻才能保持I/O低?
    发表于 12-16 06:54

    测量I/O里缺少一个Digital I/O

    跪求大神,,,我的问题是关于数据采集方面的,,在测量I/O里缺少一个Digital I/O,我已经在NI的官网里面下载了max并且都安装好了,并且对max也进行了重置,可是什么方法都试
    发表于 11-02 19:36

    STM32 I/O 口的配置

    第一:STM32 I/O 口的配置1-.1:I/O可以配置成8中不同的模式,输入四种:模拟输入,输入上拉,输入下拉,输入浮空; 输出四种:推挽输出,开漏输出,推挽式复用输出,开漏复用输
    发表于 11-23 07:40

    什么是 I/O 口?I/O 具体能做什么呢

    I/O控制对于单片机而言是最基础最核心的东西,其实单片机除了模/数转换之外的事情。其他大部分的事情I/O口都能做的到。I/
    发表于 11-24 06:47

    为什么称为I/O编程

    Linux C 文件编程 – Linux I/O编程1.为什么称为I/O编程? Linux一点哲学:一切皆为文件。2.硬件设备也被抽象为文件:对硬件的操作=对硬件
    发表于 12-15 07:07

    I/O端口的原理是什么

    这里写目录标题I/O端口原理单片机知识点补充实战1——闪烁LED指示灯I/O端口原理I/O英文全
    发表于 01-20 07:55

    控制I/O口的方法

    通过前面的输入输出的内容(LED控制与按键的使用),我们对控制I/O口有了一个基本的了解。如果需要输出高低电平,可以对该引脚进行写"1"或者"0";如果需要
    发表于 01-24 07:38

    I/O口的简单配置

    1、 关闭看门狗WDTCTL = WDTPW + WDTHOLD;2、 通用 I/O 口的设置I/O设定并不是像51单片机一样直接定义就使用,要事先定义好该
    发表于 02-15 06:12