- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
简单介绍一下io流.
以前写过两篇,里面是java 语言写的,简单介绍了一下io流,这里是对io流的整理.
https://www.cnblogs.com/aoximin/p/12007925.html 。
https://www.cnblogs.com/aoximin/p/12044270.html 。
这里说一下一个经验,仅献给入门的人.
刚写代码进行io流读取或者写入的时候,有一个思维去考虑这个io流是怎么从磁盘读取的或者怎么从内存读取的, 。
这个想法是没错的,但是不是应用层面考虑的东西,是操作系统和硬件的结合(操作系统篇会介绍全面),这会使人脑复杂,下面请以应用层面考虑问题.
在io流中有几个概念必须知道:
字符流 。
字节流 。
节点流 。
处理流 。
如果不清楚这些概念,那么你就需要看完这一篇回忆一下以前的基础.
在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");
目录有目录的信息.
这里值得注意的地方是,有些变成编程语言的思想是把目录看出文件,然后再文件对象中就可以创建出目录.
我们写代码的时候了解一下编程语言的思维就好了.
从操作数据单位不同分为:
字节流 。
字符流 。
字节流-它包括流,FileStream,MemoryStream 和 BufferedStream.
字符流-它包括TextReader-TextWriter,StreamReader,StreamWriter和其他流.
通过流的流向不同分为:
输入流 。
输出流 。
通过流的角色的不同分为:
节点流 。
处理流/包装流 。
这个下面都会介绍到.
简单介绍一下字符流,这里面有一个问题.
我们都知道,在文件存储的最小单位是字节.
总没有听说,一个文件存一个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流[三十四]的文章就讲到这里了,如果你想了解更多关于重学c#系列——IO流[三十四]的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在对一款流行游戏 (Minecraft) 进行一些修改,我在地形生成中看到了这些线条, double d4 = 1.0D; d4 *= d4; d4 *= d4; d4 = 1.0D - d4;
如何在没有浮点单元的处理器上执行 float 学运算?例如低端 8 位微 Controller 。 最佳答案 看看这篇文章:http://www.edwardrosten.com/code/fp_te
抱歉这个冗长的标题。我的代码针对没有浮点单元的微 Controller (msp430),但这应该适用于任何类似的 MCU。 如果我将一个大的运行时变量与通常被认为是浮点十进制数 (1.8) 相乘,M
我偶尔会在这个方法中遇到 stackoverflow 异常。 double norm_cdf(const double x) { double k = 1.0/(1.0 + 0.2316419
这是一个让我在过去几个小时里完全困惑的问题...... 我的程序中有一个硬编码的方程式: double s2; s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42; 每
我知道 float 学充其量是丑陋的,但我想知道是否有人可以解释以下怪癖。在我测试的大多数编程语言中,将 0.4 添加到 0.2 会产生轻微错误,而 0.4 + 0.1 + 0.1 则不会。 两者计算
随着数据量持续增长,对合格数据专业人员的需求也会增长。具体而言,对SQL流利的专业人士的需求日益增长,而不仅仅是在初级层面。 因此,Stratascratch的创始人Nathan Rosidi以及我觉
当使用 c++ 或 -O0 编译时,以下 -O1 程序给出了数值不同的结果。 #include #include #include #include int main() { std::a
我正在尝试使用 SVG 在 map 上绘制飞行路径。我在 Leaflet 之上使用 d3,但所使用的框架不会对我的问题产生影响 - 这是三 Angular 关系。 http://fiddle.jshe
使用 IEEE754 float (在 JavaScript 中)时,与数学相关的精度损失风险是什么? 10*.1 即整数乘以有理数。 最佳答案 注意:该问题经过编辑,在发布此答案后很长时间添加了“t
我需要为网站 UI 做一些基本的 float 学运算(金钱的加法和乘法)。我知道 Javascript float 由于存储方式的原因并不准确,但我也知道以某种方式,可以获得我所需的准确度。我知道这一
我有一些像下面这样的宏: #define THING_LENGTH (512) #define MAX_COUNT (4096*8) #define MAX_LENGTH ((int32)((floa
我认为这是一个非常基本的问题 - 我正在执行此功能: private double convertMetersToFeet(double meters) { //function converts
我想在不损失太多精度的情况下替换这些函数中的 float 学,因为我没有 FPU。这可能吗?我认为逗号后的 3 个数字就足够了。 inline float smaller_f(float value,
我需要一个类来表示 double vector (在数学意义上)。 我需要的特殊功能: 任意维度 vector (我通常使用 10 - 100,000 维度) 高性能(用于受 CPU 限制的数字代码)
此社区 Wiki 问题的公认答案:What are best practices that you use when writing Objective-C and Cocoa?说 iPhone 不能
This question already has an answer here: Trouble with float on C [duplicate]
以下代码有问题: private const int movementMultiplier = 2; void Test() { XmlNode xnXCoordinate = xd.Sele
大家早上好 我在 float 学方面遇到了一些问题,完全迷失在“.to_f”、“*100”和“.0”中! 我希望有人能帮助我解决我的具体问题,并准确解释他们的解决方案为何有效,以便我下次理解这一点。
我的嵌入式 C 代码在具有单精度 FPU 的 Cortex M4F 上运行。我担心编译器多久将基于软件的 double 学放在诸如 ** float_var1 = 3.0 * int_var / fl
我是一名优秀的程序员,十分优秀!