.NET 中的字符流、字节流和缓冲流

在 .NET 中,流是处理输入和输出的基础概念。流分为字符流、字节流和缓冲流,每种流有其特定的用途和特性。以下是对这些流的总结:

1. 字符流(Character Streams)

特点

  • 用于处理字符数据,自动处理字符编码。
  • 适合读取和写入文本文件。

主要类

  • StreamReader:从字符流中读取字符数据。支持多种字符编码(如 UTF-8、UTF-16)。提供方法如 Read()ReadLine()ReadToEnd()
  • StreamWriter:向字符流中写入字符数据。支持字符编码设置。提供方法如 Write()WriteLine()

示例

// 写入文本
using (StreamWriter writer = new StreamWriter("example.txt"))
{writer.WriteLine("Hello, World!");
}// 读取文本
using (StreamReader reader = new StreamReader("example.txt"))
{string content = reader.ReadToEnd();Console.WriteLine(content);
}

2. 字节流(Byte Streams)

特点

  • 用于处理原始字节数据。适合二进制文件(如图片、音频)。
  • 不处理字符编码,需要手动转换字节到字符。

主要类

  • FileStream:提供对文件的字节流读写操作。支持随机访问。提供方法如 Read()Write()Seek()
  • MemoryStream:在内存中操作字节流。适用于临时数据存储。提供方法如 Read()Write()ToArray()

示例

// 写入字节
using (FileStream fs = new FileStream("example.bin", FileMode.Create, FileAccess.Write))
{byte[] data = Encoding.UTF8.GetBytes("Hello, Binary World!");fs.Write(data, 0, data.Length);
}// 读取字节
using (FileStream fs = new FileStream("example.bin", FileMode.Open, FileAccess.Read))
{byte[] buffer = new byte[fs.Length];fs.Read(buffer, 0, buffer.Length);string text = Encoding.UTF8.GetString(buffer);Console.WriteLine(text);
}

3. 缓冲流(Buffered Streams)

特点

  • 包装其他流以提高性能,通过在内部维护缓冲区减少实际读写操作的次数。
  • 适用于大数据量的读写操作。

主要类

  • BufferedStream:对字节流进行缓冲,减少对底层流的直接操作。提供方法如 Read()Write()Flush()

示例

// 使用 BufferedStream 写入字节
using (FileStream fs = new FileStream("example.bin", FileMode.Create, FileAccess.Write))
using (BufferedStream bs = new BufferedStream(fs))
{byte[] data = Encoding.UTF8.GetBytes("Hello, Buffered World!");bs.Write(data, 0, data.Length);
}// 使用 BufferedStream 读取字节
using (FileStream fs = new FileStream("example.bin", FileMode.Open, FileAccess.Read))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader reader = new StreamReader(bs, Encoding.UTF8))
{string content = reader.ReadToEnd();Console.WriteLine(content);
}

总结

  • 字符流:适用于文本数据处理,自动处理编码转换。
  • 字节流:适用于原始数据和二进制文件处理,需要手动处理编码转换。
  • 缓冲流:用于提高大数据量读写操作的性能,通过在内存中维护缓冲区减少对底层流的直接操作。

每种流类型都有其特定的用途,选择合适的流可以显著提高程序的效率和可读性。

--------------

  • FileStream:读取和写入字节数据, 适用于处理原始字节数据,如二进制文件。用于处理大文件和支持随机访问,支持异步操作。
  • StreamReader 和 StreamWriter:专注于文本数据的读取和写入,处理字符编码。
  • File 和 FileInfo:提供静态和实例方法执行文件操作,FileInfo 提供更多操作功能。
  • MemoryStream:在内存中操作数据,适合临时数据处理。
  • BufferedStream:通过缓冲提高 I/O 操作性能

 ---------------

FileStream 可以直接读取文本文件,但它以字节为单位处理数据,因此你需要额外的步骤来将字节转换为字符串。使用 FileStream 读取文本文件的一般步骤包括:

  1. 打开文件:创建一个 FileStream 实例以读取文件。
  2. 读取数据:从流中读取字节数据。
  3. 转换字符:将读取的字节数据转换为字符串。

下面是一个示例:

using (FileStream fs = new FileStream("example.txt", FileMode.Open, FileAccess.Read))
{byte[] buffer = new byte[fs.Length];fs.Read(buffer, 0, buffer.Length);string text = Encoding.UTF8.GetString(buffer);Console.WriteLine(text);
}

在这个示例中,我们使用 Encoding.UTF8.GetString() 方法将字节数组转换为 UTF-8 编码的字符串。根据文件的实际编码方式,可能需要选择不同的编码。

using System;
using System.IO;
using System.Text;
using System.Windows.Forms;public class TextEditor : Form
{private TextBox textBox;private MenuStrip menuStrip;private ToolStripMenuItem openMenuItem;private ToolStripMenuItem saveMenuItem;public TextEditor(){// Initialize componentstextBox = new TextBox { Multiline = true, Dock = DockStyle.Fill, ScrollBars = ScrollBars.Both };menuStrip = new MenuStrip();openMenuItem = new ToolStripMenuItem("Open");saveMenuItem = new ToolStripMenuItem("Save");// Set up menumenuStrip.Items.Add(openMenuItem);menuStrip.Items.Add(saveMenuItem);this.Controls.Add(menuStrip);this.Controls.Add(textBox);this.MainMenuStrip = menuStrip;// Event handlersopenMenuItem.Click += OpenMenuItem_Click;saveMenuItem.Click += SaveMenuItem_Click;}private void OpenMenuItem_Click(object sender, EventArgs e){using (OpenFileDialog openFileDialog = new OpenFileDialog()){openFileDialog.Filter = "Text Files|*.txt|All Files|*.*";if (openFileDialog.ShowDialog() == DialogResult.OK){string filePath = openFileDialog.FileName;textBox.Text = File.ReadAllText(filePath, Encoding.UTF8);}}}private void SaveMenuItem_Click(object sender, EventArgs e){using (SaveFileDialog saveFileDialog = new SaveFileDialog()){saveFileDialog.Filter = "Text Files|*.txt|All Files|*.*";if (saveFileDialog.ShowDialog() == DialogResult.OK){string filePath = saveFileDialog.FileName;File.WriteAllText(filePath, textBox.Text, Encoding.UTF8);}}}[STAThread]public static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new TextEditor());}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/411405.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day13JS-MoseEvent事件

1. MouseEvent的类别 mousedown :按下键mouseup :释放键click :左键单击dblclick :左键双击contextmenu :右键菜单mousemove :鼠标移动mouseover : 鼠标经过 。 可以做事件委托,子元素可以冒泡…

使用Blender进行3D建模—基础操作笔记

Blender 3D 建模🚀 在博0阶段,目前已经完成立创EDA的PCB绘制的基础学习,树莓派的系统安装远程控制能学习,加上我本硕阶段学习的单片机和深度学习人工智能算法的知识,这里打算补上一块比较重要的能力拼图,就…

Netty 学习笔记

Java 网络编程 早期的 Java API 只支持由本地系统套接字库提供的所谓的阻塞函数,下面的代码展示了一个使用传统 Java API 的服务器代码的普通示例 // 创建一个 ServerSocket 用以监听指定端口上的连接请求 ServerSocket serverSocket new ServerSocket(5000); //…

c++关于字符串的练习

提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream> #include<string> using namespace std;int main() {string s1;int letter0,digit0,space0,other0;cout<<"请输入一个字符串:"…

海康二次开发学习笔记5-二次开发小技巧

二次开发小技巧 1. VM安装目录 Samples内包含C#,QT,VC应用程序 Documetnations内包含C#和C语言的帮助文档 2. 错误码 private void button4_Click(object sender, EventArgs e){try{VmSolution.Load(textBox1.Text);listBox1.Items.Add("方案加载成功.");listBox1.…

质量技术AI提效专题分享-得物技术沙龙

活动介绍 本次“质量技术&AI提效专题分享”沙龙聚焦于质量技术和AI效率领域&#xff0c;将为您带来四个令人期待的演讲话题&#xff1a; 1、《智能化提效实践》 2、《仿真自动化在饿了么金融实践分享》 3、《得物精准测试提效应用》 4、《广告算法灰度拦截实践》 相信这些…

开源的工作流系统突出优点总结

当前&#xff0c;想要实现高效率的办公&#xff0c;可以一起来了解低代码技术平台、开源的工作流系统的相关特点和功能优势。作为较受职场喜爱的平台产品&#xff0c;低代码技术平台拥有可视化才做界面、灵活、好维护操作等多个优势特点&#xff0c;在推动企业流程化办公的过程…

读软件开发安全之道:概念、设计与实施12不受信任的输入

1. 不受信任的输入 1.1. 不受信任的输入可能是编写安全代码的开发人员最关心的问题 1.1.1. 最好将其理解为输入系统中的所有不受信任的输入 1.1.2. 来自受信任的代码的输入可以提供格式正确的数据 1.2. 不受信任的输入是指那些不受你控制&#xff0c;并且可能被篡改的数据&…

RASA使用长文记录以及一些bug整理

RASA 学习笔记整理 一 安装 在虚拟环境中安装&#xff0c;进入python3版本的环境 conda activate python3 ai04机器旧版本&#xff1a;rasa-nlu和rasa-core是分开安装的 最新版本&#xff1a;rasa 将二者做了合并 直接安装 pip3 install rasa 在安装到如下步骤时候会报…

github上传代码

一般要上传github代码有两种模式&#xff0c;一种是直接在repo中上传&#xff0c;一种是通过git来上传&#xff08;win和linux都可以&#xff09;&#xff0c;来学习一下。 我们去创建好一个repo后&#xff1a; 首先是直接上传&#xff08;不推荐&#xff09; 通过upload file…

graphRAG原理解析——基于微软graphRAG+Neo4j llm-graph-builder

知识图谱生成 llm-graph-builder&#xff08;以下简称 LGB&#xff09;也使用了最新的 graph RAG 的思路&#xff0c;使用知识图谱来加持RAG&#xff0c;提供更加准确和丰富的知识问答。知识图谱的生成上&#xff0c;利用大模型的泛化能力来自动生成和构建知识图谱&#xff0…

一个下载镜像非常快的网站--华为云

1、镜像的下载飞速 链接&#xff1a;mirrors.huaweicloud.com/ubuntu-releases/24.04/ 下载一个的ubuntu24.04的镜像文件&#xff0c;5.7G的大文件&#xff0c;不到1分钟就下完毕了&#xff0c; 比起阿里云下载的速度600K/S,这个速度是100多倍。 非常的神速&#xff0c;非常…

探索联邦学习:保护隐私的机器学习新范式

探索联邦学习&#xff1a;保护隐私的机器学习新范式 前言联邦学习简介联邦学习的原理联邦学习的应用场景联邦学习示例代码结语 前言 在数字化浪潮的推动下&#xff0c;我们步入了一个前所未有的数据驱动时代。海量的数据不仅为科学研究、商业决策和日常生活带来了革命性的变化&…

[AI]从零开始的so-vits-svc webui部署教程(小白向)

一、本次教程是给谁的&#xff1f; 如果你点进了这篇教程&#xff0c;相信你已经知道so-vits-svc是什么了&#xff0c;那么我们这里就不过多讲述了。如果你还不知道so-vits-svc能做什么&#xff0c;可以去b站搜索一下&#xff0c;你大概率会搜索到一些AI合成的音乐&#xff0c;…

C#利用ffmpeg借助NVIDIA GPU实现实时RTSP硬解码+硬编码录制MP4

目录 说明 效果 项目 代码 下载 说明 利用周杰的开源项目 Sdcb.FFmpeg 项目地址&#xff1a;https://github.com/sdcb/Sdcb.FFmpeg/ 代码实现参考&#xff1a;https://github.com/sdcb/ffmpeg-muxing-video-demo 效果 C#利用ffmpeg借助NVIDIA GPU实现实时RTSP硬解码硬…

助力外骨骼机器人动力学分析

目录 一、动力学分析 二、拉格朗日方程 三、参考文献 一、动力学分析 动力学是考虑引起运动所需要的力&#xff0c;使执行器作用的力矩或施加在操作臂上的外力使操作臂按照这个动力学方程运动。 目前机器人动力学分析中主要采用牛顿-欧拉动力学方程和拉格朗日动力学方程 […

基于大数据的水资源管理与调度优化研究【Web可视化、灰色预测、大屏设计】

需要本项目的私信博主 目录 1 引言 1.1 研究背景 1.2 国内外研究现状 1.3 研究目的 1.4 研究意义 2 关键技术理论介绍 2.1 Python语言 2.2 pandas 2.3 pyecharts 2.4 灰色预测 3 数据来源及处理 3.1 数据来源 3.2 数据处理 4 数据可视化分析及大屏设计 4.1 年度…

08 - debugfs

---- 整理自 王利涛老师 课程 实验环境&#xff1a;宅学部落 www.zhaixue.cc 文章目录 0. 什么是 debugfs1. debugfs 配置编译和注册运行2. 第一个 debugfs 编程示例3. 通过 debugfs 导出整型数据4. 通过 debugfs 导出 16 进制数据5. 通过 debugfs 到处数组6. 通过 debugfs 导出…

Ubuntu20.04可以同时安装ROS(Noetic)和ROS2(Humble)

Ubuntu系统确实可以同时安装ROS&#xff08;Robot Operating System&#xff09;和ROS2&#xff0c;但需要注意一些关键步骤和配置以确保两者能够顺利共存并独立运行。以下是在Ubuntu上同时安装ROS和ROS2的详细步骤和注意事项&#xff1a; 安装前准备 检查Ubuntu版本&#xff…

nacos 动态读取nacos配置中心项目配置

实现了项目稳定运行情况下不需要在项目中改配置&#xff0c;直接在nacos中修改更方便。 pom文件&#xff1a; <!--读取bootstrap文件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap…