文件 I/O 和序列化
文件I/O
C#提供了多种方式来读写文件,主要通过System.IO命名空间中的类来实现,下方会列一些常用的类型:
-
StreamReader/StreamWriter:用于以字符为单位读取或写入文本文件。
-
BinaryReader/BinaryWriter:用于以二进制格式读取或写入基本数据类型。
-
FileStream:提供对文件的基本读写操作,并支持随机访问文件。
-
File 和 Directory 类:提供了一组静态方法,用于创建、复制、删除、移动文件和目录,以及检查文件和目录是否存在等。
使用StreamReader和StreamWriter
using System;
using System.IO;class Program
{static void Main(){string path = "example.txt";// 写入文本到文件using (StreamWriter writer = new StreamWriter(path)){writer.WriteLine("Hello, world!");}// 从文件读取文本using (StreamReader reader = new StreamReader(path)){string content = reader.ReadToEnd();Console.WriteLine(content);}}
}
使用BinaryReader和BinaryWriter
using System;
using System.IO;class Program
{static void Main(){string path = "example.dat";// 创建或覆盖文件,并准备写入using (BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Create))){writer.Write(123); // 写入整数writer.Write(3.14f); // 写入单精度浮点数writer.Write("Hello, World!"); // 写入字符串}Console.WriteLine("Data written to file.");}
}
using System;
using System.IO;class Program
{static void Main(){string path = "example.dat";// 打开文件进行读取using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open))){int intValue = reader.ReadInt32(); // 读取整数float floatValue = reader.ReadSingle(); // 读取单精度浮点数string stringValue = reader.ReadString(); // 读取字符串Console.WriteLine($"Integer Value: {intValue}");Console.WriteLine($"Float Value: {floatValue}");Console.WriteLine($"String Value: {stringValue}");}}
}
注意事项
-
顺序:当你使用
BinaryWriter写入数据时,必须记住写入数据的顺序,因为在使用BinaryReader读取数据时,你也需要按照相同的顺序来读取这些数据。 -
编码:默认情况下,
BinaryWriter使用 UTF-8 编码写入字符串。如果你需要不同的编码,可以在创建BinaryWriter实例时指定编码方式。 -
异常处理:在实际应用中,你应该添加适当的错误处理代码(如 try-catch 块),以便处理可能发生的 I/O 错误或其他异常情况。
通过 BinaryReader 和 BinaryWriter,你可以高效地对基本数据类型进行二进制格式的读写操作,这对于处理大量数据或者需要精确控制数据存储格式的情况特别有用。然而,请注意,对于复杂的对象序列化,你可能需要考虑其他方法,比如 XML 或 JSON 序列化。
使用FileStream
创建和写入文件
using System;
using System.IO;
using System.Text;class Program
{static void Main(){string path = "example.txt";string content = "Hello, World!";// 使用 FileStream 创建或覆盖文件,并准备写入using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write)){byte[] info = new UTF8Encoding(true).GetBytes(content);// 将字节数组写入文件fs.Write(info, 0, info.Length);}Console.WriteLine("Data written to file.");}
}
读取文件
using System;
using System.IO;class Program
{static void Main(){string path = "example.txt";// 使用 FileStream 打开文件进行读取using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)){byte[] b = new byte[1024];UTF8Encoding temp = new UTF8Encoding(true);// 循环读取文件中的所有数据while (fs.Read(b, 0, b.Length) > 0){Console.WriteLine(temp.GetString(b));}}}
}
使用File 和 Directory 类
常用的 File 方法包括:
-
Create: 创建或覆盖指定路径上的文件。 -
Copy: 将现有文件复制到新位置,可以选择是否覆盖目标位置的现有文件。 -
Delete: 删除指定的文件。 -
Exists: 判断指定的文件是否存在。 -
Move: 移动指定的文件到新位置。 -
ReadAllBytes,ReadAllLines,ReadAllText: 读取文件的内容为字节数组、字符串数组或单个字符串。 -
WriteAllBytes,WriteAllLines,WriteAllText: 将字节数组、字符串数组或单个字符串写入文件。
string sourceFile = @"C:\source\example.txt";
string destFile = @"D:\destination\example.txt";if (!File.Exists(destFile))
{File.Copy(sourceFile, destFile, true);
}
常用的 Directory 方法包括:
-
CreateDirectory: 创建指定路径中的所有目录和子目录。 -
Delete: 删除指定的目录及其内容。 -
Exists: 判断指定的目录是否存在。 -
GetDirectories: 获取指定目录中的子目录名称。 -
GetFiles: 获取指定目录中的文件名称。 -
Move: 将指定的目录及其内容移动到新位置。 -
EnumerateDirectories,EnumerateFiles: 遍历目录或文件集合,支持延迟执行。
string newDirPath = @"C:\newfolder";if (!Directory.Exists(newDirPath))
{Directory.CreateDirectory(newDirPath);
}
File 和 Directory注意事项:
当使用 File 或 Directory 类的静态方法可能更方便。但是,如果计划多次重用某个对象,考虑使用 FileInfo 或 DirectoryInfo 类的实例方法,因为这可以避免重复的安全检查并可能提高性能。
请注意,尽管 BinaryFormatter 曾经是一个流行的序列化工具,但出于安全性和兼容性的考虑,在新的开发工作中应避免使用它,而转向其他更安全的替代方案,如 JSON 序列化。不过,这一建议与 File 和 Directory 类的主要用途并不直接相关,这里只是作为补充信息提供。
相关文章:
文件 I/O 和序列化
文件I/O C#提供了多种方式来读写文件,主要通过System.IO命名空间中的类来实现,下方会列一些常用的类型: StreamReader/StreamWriter:用于以字符为单位读取或写入文本文件。 BinaryReader/BinaryWriter:用于以二进制格…...
python中的lambda function(ChatGPT回答)
Python 中的 lambda 函数是一个匿名函数,它没有名字,通常用于定义简单的、一次性使用的函数。它可以接受任意数量的参数,但只能有一个表达式,并且该表达式的结果就是返回值。 lambda 函数的语法是: lambda 参数1, 参…...
智慧停车系统:不同规模停车场的应用差异与YunCitys解决方案
在智慧停车领域,不同规模停车场因自身特点,对智慧停车系统的需求和应用效果存在显著差异。云创智城凭借丰富的经验和先进的技术,为各类规模停车场打造了贴合需求的智慧停车系统,下面为您详细剖析。 小型停车场:精准高…...
AI软件栈:LLVM分析(三)
LLVM IR 文章目录 CFG线性IR 主要采用CFG与线性IR组合描述 CFG *关键在于基本块(Basic Block)的定义 线性IR *关键来自于SSA,单静态赋值...
C++Primer逻辑和关系运算符
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
从BIO到NIO:Java IO的进化之路
引言 在 Java 编程的世界里,输入输出(I/O)操作是基石般的存在,从文件的读取写入,到网络通信的数据传输,I/O 操作贯穿于各种应用程序的核心。BIO(Blocking I/O,阻塞式 I/O࿰…...
VMware Win10下载安装教程(超详细)
《网络安全自学教程》 从MSDN下载系统镜像,使用 VMware Workstation 17 Pro 安装 Windows 10 consumer家庭版 和 VMware Tools。 Win10下载安装 1、下载镜像2、创建虚拟机3、安装操作系统4、配置系统5、安装VMware Tools 1、下载镜像 到MSDN https://msdn.itellyou…...
Redis存储⑤Redis五大数据类型之 List 和 Set。
目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…...
3-kafka服务端之控制器
文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker,其中有一个broker会被选举为控制器(Kafka Controler),它负责管理整个集群中所有分区和副本的状态。…...
e2studio开发RA2E1(5)----GPIO输入检测
e2studio开发RA2E1.5--GPIO输入检测 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置GPIO口配置按键口配置按键口&Led配置R_IOPORT_PortRead()函数原型R_IOPORT_PinRead()函数原型代码 概述 本篇文章主要介绍如何…...
[LeetCode]全排列I,II
全排列I 给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入࿱…...
【Elasticsearch】parent aggregation
在Elasticsearch中,Parent Aggregation是一种特殊的单桶聚合,用于选择具有指定类型的父文档,这些类型是通过一个join字段定义的。以下是关于Parent Aggregation的详细介绍: 1.基本概念 Parent Aggregation是一种聚合操作&#x…...
Java 大视界 -- 深度洞察 Java 大数据安全多方计算的前沿趋势与应用革新(52)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
C# 使用ADO.NET访问数据全解析
.NET学习资料 .NET学习资料 .NET学习资料 在 C# 的应用开发中,数据访问是极为关键的部分。ADO.NET作为.NET 框架下用于数据访问的核心技术,能够帮助开发者便捷地与各类数据源进行交互。本文将深入剖析ADO.NET,带你掌握使用 C# 通过ADO.NET访…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter4-变量、作用域与内存
四、变量、作用域与内存 正如 ECMA-262 所规定的,JavaScript 变量是松散类型的,而且变量不过就是特定时间点一个特定值的名称而已。由于没有规则定义变量必须包含什么数据类型,变量的值和数据类型在脚本生命期内可以改变。 ECMAScript 变量可…...
Unity扩展编辑器使用整理(一)
准备工作 在Unity工程中新建Editor文件夹存放编辑器脚本, Unity中其他的特殊文件夹可以参考官方文档链接,如下: Unity - 手册:保留文件夹名称参考 (unity3d.com) 一、菜单栏扩展 1.增加顶部菜单栏选项 使用MenuItemÿ…...
如何查看:Buildroot所使用Linux的版本号、gcc交叉编译工具所使用的Linux的版本号、开发板上运行的Linux系统的版本号
定义编号①②③的含义 将“Buildroot所使用Linux的版本号”编号为① 将“gcc交叉编译工具所使用的Linux的版本号”编号为② 将“开发板上运行的Linux系统的版本号”编号为③ 查看①和②的共同方法(通过sysroot查看) 由于此二者都有目录sysroot,而通过目录sysroot…...
Java实战经验分享
1. 项目优化与性能提升 面试问题: 聊聊你印象最深刻的项目,或者做了哪些优化 你在项目中如何解决缓存穿透问题? 缓存穿透是我们做缓存优化时最常遇到的问题,特别是当查询的对象在数据库中不存在时,缓存层和数据库都会…...
python安装包,!pip 和不加!命令,功能区别一览
python安装包,!pip 和不加!命令,功能区别一览 1. !pip2. pip(不加 !)3. 区别总结4. 推荐用法5. 注意事项6. 总结 在 Jupyter Notebook 或 IPython 环境中,!pip 和 pip 的功能有所不同,主要体现在执行环境和…...
html转PDF文件最完美的方案(wkhtmltopdf)
目录 需求 一、方案调研 二、wkhtmltopdf使用 如何使用 文档简要说明 三、后端服务 四、前端服务 往期回顾 需求 最近在做报表类的统计项目,其中有很多指标需要汇总,网页内容有大量的echart图表,做成一个网页去浏览,同时…...
我最近在干什么【2】
前言 这系列的上一篇是2024.12.05写的,现在是2025.02.06,这都两个月🤔小久。 不是完整全面的技术分享,话题聚焦个人成长(学的技术、了解到的信息、看的书……) 方面。文章偏意识流点,单纯分享我…...
deepseek本地部署
DeepSeek本地部署详细指南 DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,这里记录自己DeepSeek本地部署流程。 主机环境 cpu:amd 7500Fgpu:406…...
【Reading Notes】Favorite Articles from 2025
文章目录 1、January2、February3、March4、April5、May6、June7、July8、August9、September10、October11、November12、December 1、January 极越之后,中国车市只会倒下更多人(2025年01月01日) 在这波枪林弹雨中,合资品牌中最…...
配置@别名路径,把@/ 解析为 src/
路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js ,内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定: 使用 表示src文件所在路径: path.resolve(__dirname,src)…...
【LeetCode 刷题】回溯算法(2)-分割问题
此博客为《代码随想录》二叉树章节的学习笔记,主要内容为回溯算法分割问题相关的题目解析。 文章目录 131.分割回文串93.复原IP地址 131.分割回文串 题目链接 class Solution:def partition(self, s: str) -> List[List[str]]:res, path [], []def check(s: …...
AJAX笔记原理篇
黑马程序员视频地址: AJAX-Day03-01.XMLHttpRequest_基本使用https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p33https://www.bilibili.com/video/BV1MN411y7pw?vd_sour…...
一表总结 Java 的3种设计模式与6大设计原则
设计模式通常分为三大类:创建型、结构型和行为型。 创建型模式:主要用于解决对象创建问题结构型模式:主要用于解决对象组合问题行为型模式:主要用于解决对象之间的交互问题 创建型模式 创建型模式关注于对象的创建机制…...
[paddle] 矩阵的分解
特征值 设 A A A 是一个 n n n \times n nn 的方阵, λ \lambda λ 是一个标量, v \mathbf{v} v 是一个非零向量。如果满足以下方程: A v λ v A\mathbf{v} \lambda\mathbf{v} Avλv 则称 λ \lambda λ 为矩阵 A A A 的一个 特征值…...
极限的深入探讨:从概念到应用的完整指南
极限的深入探讨:从概念到应用的完整指南 一、历史背景与发展 1. 极限概念的演变 在维尔斯特拉斯(Karl Weierstrass,1815-1897)提出他的严格定义之前,极限概念经历了漫长的发展过程: 古希腊时期…...
康谋方案 | BEV感知技术:多相机数据采集与高精度时间同步方案
随着自动驾驶技术的快速发展,车辆准确感知周围环境的能力变得至关重要。BEV(Birds-Eye-View,鸟瞰图)感知技术,以其独特的视角和强大的数据处理能力,正成为自动驾驶领域的一大研究热点。 一、BEV感知技术概…...
