- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!