前言

简单介绍一下io流。

以前写过两篇,里面是java 语言写的,简单介绍了一下io流,这里是对io流的整理。

https://www.cnblogs.com/aoximin/p/12007925.html

https://www.cnblogs.com/aoximin/p/12044270.html

这里说一下一个经验,仅献给入门的人。

刚写代码进行io流读取或者写入的时候,有一个思维去考虑这个io流是怎么从磁盘读取的或者怎么从内存读取的,

这个想法是没错的,但是不是应用层面考虑的东西,是操作系统和硬件的结合(操作系统篇会介绍全面),这会使人脑复杂,下面请以应用层面考虑问题。

正文

在io流中有几个概念必须知道:

  1. 字符流

  2. 字节流

  3. 节点流

  4. 处理流

如果不清楚这些概念,那么你就需要看完这一篇回忆一下以前的基础。

在java中,比如一个文件的读取,分为FileInputStream 和 FileOutputStream。

但是在c# 是这样设计的,文件流就是文件流, 没有把输入和输出分开。

但是一般情况下,我们要么读,要么写,这样复杂度就更低了。

比如我们创建一个文件流:

FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileShare.Read);

这里面有几个参数,分别是: 地址,FileMode,FileAccess,FileShare

那么看下FileMode 里面有什么吧。

  public enum FileMode
{
CreateNew = 1,
Create = 2,
Open = 3,
OpenOrCreate = 4,
Truncate = 5,
Append = 6,
}

可以直接参考这个文档:

https://learn.microsoft.com/zh-cn/dotnet/api/system.io.filemode?view=net-7.0

文档中描述的比较清楚,就不赘述了。

FileAccess 第二个参数是FileAccess

  [Flags]
public enum FileAccess
{
Read = 1,
Write = 2,
ReadWrite = Write | Read, // 0x00000003
}

权限,是读,写,或者读和写。

第4个参数是FileShare:

https://learn.microsoft.com/zh-cn/dotnet/api/system.io.fileshare?view=net-7.0

就是一些共享状态,比如我这个文件在读了,另外的文件是否可以读。

这个可以根据自己的应用需求去处理。

然后我们一般情况下是会使用一个叫做File.create 方式去创建文件流的。

那么它的默认状态是:

public static FileStream Create(string path, int bufferSize)
=> new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None, bufferSize);

所以这里要知道的是,如果我们使用File.create得到的FileStream。

如果文件存在呢,那么文件就会从头开始写,这点是新手值得注意的地方。

知道了前面这些基础概念后,那么就可以往下走了。

文件

我们在应用层面向对象变成,那么我们要做的是什么?

要做的就是如果将这个文件,如果抽象成一个对象。

那么我们编程使用什么方式可以抽象成一个对象呢?

static void Main(string[] args)
{
FileInfo a = new FileInfo("a.txt"); Console.ReadKey();
}

有一个FileInfo 供我们使用,这样就可以将文件映射成一个对象了。

一个FileInfo 我们可以拿到上面这些信息。

还可以对文件进行操作:

比如:

这些是操作文件的,那么有个问题啊,那就是如何操作目录呢?

DirectoryInfo a = new DirectoryInfo("c://a");

目录有目录的信息。

这里值得注意的地方是,有些变成编程语言的思想是把目录看出文件,然后再文件对象中就可以创建出目录。

我们写代码的时候了解一下编程语言的思维就好了。

io 流的分类

从操作数据单位不同分为:

  1. 字节流

  2. 字符流

字节流-它包括流,FileStream,MemoryStream 和 BufferedStream。

字符流-它包括TextReader-TextWriter,StreamReader,StreamWriter和其他流。

通过流的流向不同分为:

  1. 输入流

  2. 输出流

通过流的角色的不同分为:

  1. 节点流

  2. 处理流/包装流

这个下面都会介绍到。

字符流

简单介绍一下字符流,这里面有一个问题。

我们都知道,在文件存储的最小单位是字节。

总没有听说,一个文件存一个bit吧。字节是存储的最小单位。

那么就有一个问题啊,比如我们io,那么最小有效单位应该也是字节吧。

传输的也是字节对吧,建立在这个理论基础上,那么我们的字节流是合情合理的。

这个是传输层面的意义了。

那么为什么有字符流呢?因为我们发现字符格式有utf-8,ASCII等。

比如说utf-8,汉字是3个字节。比如一个我,那么应该读取3个字节,而不是一个字节才是有意义的对吧。

那么就有字符流了。字节流是每次都是读取一个字节,字符流每次读取的那么就可能是一个字节或者两个或者3个,看编码形式。

static void Main(string[] args)
{
TextReader textReader = new StreamReader("a.txt", Encoding.ASCII);
Console.ReadKey();
}

StreamReader 是文件字符流。TextReader 是其基类。

所有的字符流的读取基类是TextReader。

StreamReader 是对文件的字符流的读写,那么StringReader 是对内存的读写了。

其他的就不演示了,自我熟悉就好,c# 官方文档更加专业。

看文档就好:

https://learn.microsoft.com/zh-cn/dotnet/api/system.io.stringreader?view=net-7.0

节点流和处理流

什么是节点流呢:

节点流是从一个特定的数据源读写数据,如:StreamReader、FileStream。

就是直接从一个数据源进行读写。

那么什么是处理流呢?

处理流也叫做包装流,是连接在存在的流之上,为程序提供更为强大的读写功能,如BufferedStream。

static void Main(string[] args)
{
var a= File.Create("a.txt");
BufferedStream stream = new BufferedStream(a);
Console.ReadKey();
}

二进制处理流

二进制处理流是这样的,其实很像字符流。

比如说,我们除了存字符,我们还可以存数字对吧。

还可以存bool类型。

那么其实就是如果是读取int,那么就是读取4个字节,读取bool 就是读取两个字节。

static void Main(string[] args)
{
MemoryStream aStream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(aStream);
writer.Write(10);
writer.Write(20);
Console.Read();
}

读取的时候也是一样的。

也没什么好记的,主要是整理一些概念,一些实现原理,会查文档就好。

重学c#系列—— IO流[三十四]的更多相关文章

  1. 【重学Java】IO流

    IO流的UML类图 File类 File类概述和构造方法[应用] File类介绍 它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于File而言,其封装的并不是一个真正存在 ...

  2. 17 IO流(十四)——Print流

    PrintStream流 PrintStream作为一个包装流,它可以包装字节流,甚至可以使用指定的文件创建一个打印流.它的构造函数很丰富,建议打开API看一下. 它常用的方法是print方法与pri ...

  3. 从零开始学C++之IO流类库(四):输出流格式化(以操纵子方式格式化 以ios类成员函数方式格式化)

    一.以操纵子方式格式化 数据输入输出的格式控制使用系统头文件<iomanip>中提供的操纵符.把它们作为插入操作符<<的输出对象即可.如setiosflags.setw.set ...

  4. 代码实现:当我们下载一个试用版软件,没有购买正版的时候,每执行一次就会提醒我们还有多少次使用机会用学过的IO流知识,模拟试用版软件,试用10次机会,执行一次就提示一次您还有几次机会,如果次数到了提示请购买正版

    package com.loaderman.test; import java.io.BufferedReader; import java.io.FileReader; import java.io ...

  5. 重学c#系列——字典(十一)

    前言 重学c#系列继续更新,简单看一下字典的源码. 看源码主要是解释一下江湖中的两个传言: 字典foreach 顺序是字典添加的顺序 字典删除元素后,字典顺序将会改变 正文 那么就从实例化开始看起,这 ...

  6. 《手把手教你》系列技巧篇(三十四)-java+ selenium自动化测试-单选和多选按钮操作-中篇(详解教程)

    1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历单选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的单选按钮进行实战. 2.d ...

  7. SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关

    开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...

  8. JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

    JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...

  9. NeHe OpenGL教程 第三十四课:地形

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  10. spring boot 常见三十四问

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

随机推荐

  1. JavaScript实现带省略号的分页

    1.实现功能 可以跳转上一页.下一页.数据过多省略号显示,点击省略号可以实现快速跳转. 纯js+html+css实现,引入js文件后再使用方法即可快速生成. 2.实现过程 2.1 html页面(ind ...

  2. 【lwip】09-IPv4协议&超全源码实现分析

    目录 前言 9.1 IP协议简述 9.2 IP地址分类 9.2.1 私有地址 9.2.2 受限广播地址 9.2.3 直接广播地址 9.2.4 多播地址 9.2.5 环回地址 9.2.6 本地链路地址 ...

  3. 抠网页标题栏logo(图标)

    1.打开自己需要抠的网页,例如百度页面 2.在这个网页链接后面+" /favicon.ico " 就可以提取ico图片 3.回车进去,右键鼠标,选择另存为图片就可以成功保存网页中的 ...

  4. 利用KubeEdge在A500部署边缘推理任务

      利用KubeEdge在A500部署边缘推理任务 目  录 1 环境介绍... 1 2 云端环境部署... 2 2.1 在master节点安装Docker和k8S (ubuntu) 2 2.1.1 ...

  5. 【Java集合框架002】原理层面:HashMap全解析

    一.前言 二.HashMap 2.1 HashMap数据结构 + HashMap线程不安全 + 哈希冲突 2.1.1 HashMap数据结构 学习的时候,先整体后细节,HashMap整体结构是 底层数 ...

  6. python安装/环境变量配置/多版本共存

    Python学习之路Day02: 一.今日学习内容概括: 计算机五大组成部分详解 计算机三大核心硬件 操作系统 编程与编程语言 编程语言的发展 编程语言分类 python解释器 Python Pyth ...

  7. form enctype="multipart/form-data" ajax 文件上传

    <form method="post" enctype="multipart/form-data" id="resource"> ...

  8. linux系统编码修改

    1. 查看当前系统默认采用的字符集locale 2. 查看系统当前编码echo $LANG如果输出为:en_US.UTF-8     英文zh_CN.UTF-8     中文 3. 查看系统是否安装中 ...

  9. 【每日一题】【二分mid&贪心】2022年2月8日-NC163 最长上升子序列(一)

    1.描述给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度.所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组.例如 [1,5,3,7,3] 数组,其子序列有:[1,3, ...

  10. MySQL数据库和Python的交互

    一.缘由 这是之前学习的时候写下的基础代码,包含着MySQL数据库和Python交互的基本操作. 二.代码展示 import pymysql ''' 1.数据库的链接和创建视图 ''' # db=py ...