C# 字节流 与 StreamReader 读取 Json 格式文件内容并处理的函数

读取并处理Json格式数据文件的两种读取方法:

方法一:以字节流的方式读取并处理

public static bool WriteByToken(string fileName, string token, string val, Encoding coder)
{if (!File.Exists(fileName))return false;//string jsonText = File.ReadAllText(fileName); // 若不是频繁操作同一文件,则用此函数直接读取即可FileStream stream = null;JObject jsObj = null;try{stream = File.Open(fileName, FileMode.Open,FileAccess.ReadWrite, FileShare.ReadWrite);byte[] buffer = new byte[stream.Length];stream.Read(buffer, 0, (int)stream.Length);string jsonText = coder.GetString(buffer);jsObj = JObject.Parse(jsonText);JToken tokenNode = jsObj.SelectToken(token);tokenNode.Replace(val);byte[] writeBuffer = coder.GetBytes(JsonConvert.SerializeObject(jsObj, Formatting.Indented));stream.Seek(0, SeekOrigin.Begin);stream.SetLength(0); // 在写入新的内容之前,用 SetLength(0) 清空文件内容,防止由于 stream 的长度不等于writeBuffer.Length 导致后续保存后文件中出现额外字符stream.Write(writeBuffer, 0, writeBuffer.Length);stream.Flush();stream.Close();stream = null;GC.Collect(); // 强制对资源进行回收,主要是防止由于频繁调用此函数操作同一文件,导致句柄来不及释放//File.WriteAllText(fileName, JsonConvert.SerializeObject(jsObj, Formatting.Indented));// 若不是频繁操作同一文件,则用此函数直接写入即可}catch (JsonReaderException ex){return false;}catch (Exception ex){return false;}finally{if (stream != null){stream.Close();stream = null;}}return true;
}

方法二:以 StreamReader 读取并处理

public static bool WriteByToken(string fileName, string token, float val, Encoding coder)
{if (!File.Exists(fileName))return false;string jsonText = string.Empty;FileStream fs = null;StreamReader sr = null;StreamWriter writer = null;try{fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);sr = new StreamReader(fs, coder);jsonText = sr.ReadToEnd();sr.Close();fs.Close();JObject jsObj = JObject.Parse(jsonText);JToken tokenNode = jsObj.SelectToken(token);tokenNode.Replace(val);fs = new FileStream(fileName, FileMode.Truncate, FileAccess.Write, FileShare.ReadWrite);writer = new StreamWriter(fs);writer.Write(JsonConvert.SerializeObject(jsObj, Formatting.Indented));writer.Flush();writer.Close();fs.Close();}catch (JsonReaderException){return false;}catch (Exception ex){return false;}finally{if (sr != null){sr.Close();sr = null;}if (fs != null){fs.Close();fs = null;}if (writer != null){writer.Close();writer = null;}}return true;}

对比:

  1. 文件读取方式
  • 第一种方法:手动处理字节流,可能需要额外处理编码和字符集,适合于需要字节级操作或特殊编码需求的情况。
  • 第二种方法:使用 StreamReader 是一种更高层次的读取方式,它简化了字符编码和流的处理,通常更适用于文本文件的读取。它可以自动处理字符集,更方便。
  1. 文件写入方式
  • 第一种方法:直接操作文件流的字节内容,灵活性较高,但是相对而言稍微复杂一些,需要手动管理文件位置和写入字节数组。没有清晰的字符流管理,可能在字符集编码方面稍显麻烦。
  • 第二种方法:使用 StreamWriter 进行写入,它是字符流的包装类,适合处理文本文件,简化了写入过程,尤其是字符编码和字符转换等问题。
  1. 资源管理
  • 第一种方法:资源管理比较粗糙,虽然它会在 finally 块中关闭流,但强制垃圾回收(GC.Collect())是比较危险的做法,可能导致性能下降。通常不建议手动调用垃圾回收器。
  • 第二种方法:通过 Dispose() 释放资源,符合 .NET 的标准做法,并且它处理了流和其他对象的资源管理。这样可以确保资源得到及时释放,避免资源泄漏。
  1. 代码可读性和维护性
  • 第一种方法:代码较为复杂且不容易维护,因为需要手动管理字节流、文件位置、字符编码等细节,增加了出错的风险。
  • 第二种方法:代码更清晰,使用 StreamReader 和 StreamWriter 简化了读取和写入操作,维护起来相对容易。
  1. 性能考虑
  • 第一种方法:对于较大的文件,字节流的处理可能更高效,因为它避免了中间的字符转换操作。
  • 第二种方法:对大文件的处理可能稍慢,特别是如果涉及字符编码转换等操作,但对于一般文本文件来说性能足够好。

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

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

相关文章

docker-compose搭建xxl-job、mysql

docker-compose搭建xxl-job、mysql 1、搭建docker以及docker-compose2、下载xxl-job需要数据库脚本3、创建文件夹以及docker-compose文件4、坑来了5、正确配置6、验证-运行成功 1、搭建docker以及docker-compose 略 2、下载xxl-job需要数据库脚本 下载地址:https…

深入理解 TypeScript:联合类型与交叉类型的应用

在 TypeScript 的世界里,类型系统是核心特性之一,它提供了强大的工具来帮助开发者编写更安全、更可靠的代码。今天,我们将深入探讨 TypeScript 中的两个高级类型特性:联合类型(Union Types)和交叉类型&…

XML JSON

XML 与 JSON 结构 XML(eXtensible Markup Language) 1. 定义 XML 是一种标记语言,用于描述数据的结构和内容。主要用于数据存储与交换。 2. 特点 可扩展性:用户可以自定义标签。层次化结构:数据以树形结构组织&…

初次chronyd安装使用

在 CentOS 或 RHEL 中,ntpdate 命令用于立即更新系统时间,而 chronyd 是一个更为先进的时间同步服务。虽然它们都可以用来同步时间,但它们的工作方式和命令参数有所不同。 如果你想使用 chronyd 来同步时间,类似于使用 ntpdate x…

【Innodb阅读笔记】之 二进制文件应用,主从复制搭建

一、概述 MySQL的主从复制(Master-Slave Replication)是一种数据复制解决方案,将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而是的从…

React Native 原生开发指南

写在前面 React Native (RN) 是一个用于构建跨平台移动应用的框架。它允许开发者使用 JavaScript 和 React 来编写应用程序,并将其转换为原生代码。虽然 RN 提供了许多内置的组件和 API,但有时候你可能需要访问原生平台的特定功能或性能优化。为此&…

如何制作项目网页

一、背景 许多论文里经常会有这样一句话Supplementary material can be found at https://hri-eu.github.io/Lami/,这个就是将论文中的内容或者补充视频放到一个网页上,以更好的展示他们的工作。因此,这里介绍下如何使用前人提供的模板制作我…

Spring:Spring事务管理代码案例讲解

Spring事务管理知识讲解请见:Spring事务知识点讲解 下面演示一个代码示例进行理解。 需求 两个账户相互转账,并记录日志,即使有转账失败也要记录 需求分析 这里主要是需要开启事务机制来控制转入和转出: 1,创建一…

了解网络威胁情报:全面概述

网络威胁情报 CTI 是指系统地收集和分析与威胁相关的数据,以提供可操作的见解,从而增强组织的网络安全防御和决策过程。 在数字威胁不断演变的时代,了解网络威胁情报对于组织来说至关重要。复杂网络攻击的兴起凸显了制定强有力的策略以保护敏…

Scrapy图解工作流程-cnblog

1.1 介绍部分: 文字提到常用的Web框架有Django和Flask,接下来将学习一个全球范围内流行的爬虫框架Scrapy。 1.2 内容部分: Scrapy的概念、作用和工作流程 Scrapy的入门使用 Scrapy构造并发送请求 Scrapy模拟登陆 Scrapy管道的使用 Scrapy中…

【ArcGISPro】Sentinel-2数据处理

错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集

Python数据分析(OpenCV)

第一步通过pip安装依赖包,执行一下命令 pip install opencv-python 如果是Anaconda请在工具中自行下载 下载好咋们就可以在环境中使用了。 人脸识别的特征数据可以到 github上面下载,直接搜索OpenCV 然后我们在源码中通过cv2的级联分类器引入人脸的特征…

最小生成树-Prim与Kruskal算法

文章目录 什么是最小生成树?Prim算法求最小生成树Python实现: Kruskal算法求最小生成树并查集 Python实现: Reference 什么是最小生成树? 在图论中,树是图的一种,无法构成闭合回路的节点-边连接组合称之为…

深入理解 Java 基本语法之数组

目录 一、数组基础概念 二、数组的声明 1. 基本数据类型数组声明: 2. 引用数据类型数组声明: 三、数组的创建 四、数组的初始化 五、数组的使用 ​编辑1. 获取长度以及访问元素: 2. 数组作为方法的参数: 3. 数组作为方法…

计算机毕业设计PySpark+Scrapy农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

17. C++模板(template)1(泛型编程,函数模板,类模板)

⭐本篇重点:泛型编程,函数模板,类模板 ⭐本篇代码:c学习/07.函数模板 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. 泛型编程 二. 函数模板 2.1 函数模板的格式 2.2 函数模板的简单使用 2.3 函数模板…

ICPM端口的用途是什么?

‌ICMP(Internet Control Message Protocol,互联网控制报文协议)‌是TCP/IP协议簇的一个子协议,主要用于在IP主机和路由器之间传递控制消息。这些控制消息包括网络通不通、主机是否可达、路由是否可用等信息,虽然不传输…

Jupyter Notebook的安装和配置提示功能

Python开发环境搭建conda管理环境-CSDN博客 安装anaconda和对接到编译器的教程可以看上面这一篇 Jupyter Notebook是一种交互式计算环境,它允许用户在单个文档中编写和执行代码、方程、可视化和文本。与其他编译器相比,Jupyter Notebook的突出点在于其交…

视图查询中投影裁剪规则的原理和解析 | OceanBase 查询优化

背景 在SQL查询中使用视图查询时,执行中可能会产生的较多的中间结果集。为了优化这类查询的执行,OceanBase 引入了投影裁剪规则。能够识别出父查询中未实际使用的列,并将这些列从视图查询的select列表中剔除,进而提升整体查询的性…

maxun爬虫工具docker搭建

思路来源开源无代码网络数据提取平台Maxun 先把代码克隆到本地(只有第一次需要) git clone https://github.com/getmaxun/maxun.git 转到maxun目录 cd maxun 启动容器 docker-compose --env-file .env up -d 成功启动六个容器 网址 http://local…