当前位置: 首页 > news >正文

C# FileStream 使用详解

总目录


前言

在 C# 编程中,文件操作是常见的任务之一。FileStream 类是 System.IO 命名空间中的一个重要类,它提供了对文件的读取和写入操作的底层支持。本文将详细介绍 FileStream 的使用方法,包括如何创建、读取、写入文件,以及一些实用的技巧和注意事项。


一、什么是 FileStream ?

1. 定义

FileStream类位于System.IO命名空间中,它继承自Stream类,是一个用于表示文件的字节流的类。。FileStream允许我们以字节流的形式同步或异步读写文件,可以指定文件的访问模式、共享模式和缓冲区大小等参数。

FileStream 是许多高级文件操作类(如 StreamReaderStreamWriterBinaryReaderBinaryWriter)的基础。

2. FileStream 的核心功能

FileStream 是对文件的字节级操作类,允许直接访问文件的物理存储。其主要功能包括:

  • 读写字节数据:通过 ReadWrite 方法操作文件的原始字节。
  • 控制文件模式:通过 FileMode 枚举指定文件的打开、创建、覆盖等行为。
  • 管理文件访问权限:通过 FileAccessFileShare 控制读写权限及与其他进程的共享方式。
  • 定位文件指针:通过 Seek 方法快速跳转到文件的任意位置。

3. 适用场景

FileStream作为C#文件操作的基础设施,其灵活性和高性能特性使其在以下场景不可替代:

  • 二进制文件(如图片、音视频)处理(如图像加密)
  • 超大文件分块读写
  • 需要精准控制文件指针的随机访问
  • 低延迟高吞吐量IO操作

二、基础用法与参数详解

1. 创建 FileStream 对象

在使用 FileStream 之前,需要先创建一个 FileStream 对象。这可以通过 FileStream 的构造函数来完成。FileStream 的构造函数有多个重载版本,常用的有以下几种:

1)基本构造函数

public FileStream(string path, FileMode mode);
  • path:文件的路径。
  • mode:指定文件的打开模式,FileMode 是一个枚举类型,常见的值包括:
模式文件存在时文件不存在时指针位置
CreateNew抛出异常创建新文件开头
Create覆盖现有文件创建新文件开头
Open打开文件抛出异常开头
OpenOrCreate打开文件创建新文件开头
Truncate清空文件内容抛出异常开头
Append打开并追加创建新文件末尾
// 安全创建文件示例
if(File.Exists("temp.data"))
{using var fs = new FileStream("temp.data", FileMode.Truncate);
}
else
{using var fs = new FileStream("temp.data", FileMode.CreateNew);
}

2)带访问模式的构造函数

public FileStream(string path, FileMode mode, FileAccess access);
  • access:指定文件的访问模式,FileAccess 是一个枚举类型,常见的值包括:
    • Read:只读访问。
    • Write:只写访问。
    • ReadWrite:读写访问。
// 创建一个 FileStream 对象,用于读取文件
FileStream fsRead = new FileStream("example.txt", FileMode.Open, FileAccess.Read);
// 创建一个 FileStream 对象,用于写入文件
FileStream fsWrite = new FileStream("example.txt", FileMode.Create, FileAccess.Write);

3)带共享模式的构造函数

public FileStream(string path, FileMode mode, FileAccess access, FileShare share);
  • share:指定文件的共享模式,FileShare 是一个枚举类型,常见的值包括:
    • None:不允许其他进程或线程操作。
    • Read:允许其他进程或线程以只读模式打开。
    • Write:允许其他进程或线程以只写模式打开。
    • ReadWrite:允许其他进程或线程以读写模式打开。
    • Delete:允许其他进程或线程删除该文件。

4)参数说明

▶ 关键参数
参数描述
path文件路径,支持绝对路径或相对路径。
mode文件操作模式(如 FileMode.Create 创建新文件,FileMode.Open 打开现有文件)。
access访问权限(如 FileAccess.ReadFileAccess.WriteFileAccess.ReadWrite)。
share共享模式,控制其他进程或线程是否可同时访问文件(如 FileShare.Read 允许其他进程读取)。
▶ 高级构造参数
// 最完整参数形式
var fs = new FileStream(path: "data.bin", mode: FileMode.OpenOrCreate, access: FileAccess.ReadWrite, share: FileShare.Read, bufferSize: 8192, options: FileOptions.Asynchronous
);
参数名称作用典型值示例
bufferSize设置缓冲区大小(字节)建议设为4096的倍数提升性能,如 4096, 8192, 16384
useAsync启用异步操作true/false
FileOptions文件高级选项FileOptions.SequentialScan

2. 向文件中写入数据

使用 FileStream 向文件中写入数据,可以通过 Write 方法实现。Write 方法的定义如下:

public override void Write(byte[] array, int offset, int count);
  • array:要写入的字节数组。
  • offset:数组中的起始位置。
  • count:要写入的字节数。

1)写入文件

// 创建并写入文件
using (FileStream fs = new FileStream("data.bin", FileMode.Create, FileAccess.Write))
{byte[] data = { 1, 2, 3, 4 };fs.Write(data, 0, data.Length); // 写入 4 字节
}

2)追加写入

// 追加模式写入
using (FileStream fs = new FileStream("log.txt", FileMode.Append, FileAccess.Write))
{byte[] data = Encoding.UTF8.GetBytes("追加内容\n");fs.Write(data, 0, data.Length);
}

3. 从文件中读取数据

使用 FileStream 从文件中读取数据,可以通过 Read 方法实现。Read 方法的定义如下:

public override int Read(byte[] array, int offset, int count);
  • array:用于存储读取到的数据的字节数组。
  • offset:数组中的起始位置。
  • count:要读取的字节数。
  • 返回值:实际读取到的字节数。
// 打开并读取文件
using (FileStream fs = new FileStream("data.bin", FileMode.Open, FileAccess.Read))
{byte[] buffer = new byte[4];// 读取到缓冲区fs.Read(buffer, 0, buffer.Length); // 读取 4 字节Console.WriteLine(BitConverter.ToString(buffer)); // 输出 "01-02-03-04"
}

4. 文件定位

在读取或写入文件时,可能需要在文件中进行定位操作。FileStream 提供了 Position 属性和 Seek 方法来实现文件定位。

1)Position 属性

Position 属性获取或设置当前读写位置。

// 记录当前位置
long pos = fs.Position;// 设置当前读写位置为文件开头
fs.Position = 0;// 回退100字节
fs.Position -= 100;

2)Seek 方法

Seek 方法用于在流中查找指定位置。其定义如下:

public override long Seek(long offset, SeekOrigin origin);
  • offset:相对于 origin 的偏移量。
  • origin:指定偏移量的参考点,SeekOrigin 是一个枚举类型,常见的值包括:
    • Begin:从流的开头开始计算。
    • Current:从当前位置开始计算。
    • End:从流的末尾开始计算。
  • 返回值:新的位置。

通过 Seek 方法可以快速跳转到文件的任意位置:

// 定位到文件末尾
long position = fs.Seek(0, SeekOrigin.End); // 0 表示偏移量,SeekOrigin.End 表示从末尾开始// 定位到文件开头的第 10 个字节
fs.Seek(10, SeekOrigin.Begin);

示例:文件定位

		using (FileStream fs = new FileStream("example.txt", FileMode.Open)){// 定位到文件第5个字节的地方fs.Seek(5, SeekOrigin.Begin);// 创建字节数组,用于存储读取到的数据byte[] data = new byte[fs.Length - fs.Position];// 读取数据int bytesRead = fs.Read(data, 0, data.Length);// 输出读取到的数据Console.WriteLine("从文件中间读取到的数据:");Console.WriteLine(System.Text.Encoding.UTF8.GetString(data, 0, bytesRead));}

5. 文件的扩展和清空

1)设置文件长度

使用 SetLength 方法可以设置文件的长度。如果新长度大于当前长度,则文件将被扩展;如果新长度小于当前长度,则文件将被截断。

// 将文件长度设置为 100 字节
fs.SetLength(100);

2)清空文件

要清空文件内容,可以将文件长度设置为 0。

// 清空文件
fs.SetLength(0);

三、FileStream 的高级使用

1. 异步操作

FileStream 支持异步读取和写入操作,这在处理大文件或需要提高程序响应性时非常有用。

1)异步写入

使用 BeginWriteEndWrite 方法可以实现异步写入。

class Program
{static void Main(){// 文件路径string path = "example.txt";// 要写入的数据byte[] data = new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33 };using (FileStream fs = new FileStream(path, FileMode.Create)){// 异步写入数据IAsyncResult result = fs.BeginWrite(data, 0, data.Length, null, null);result.AsyncWaitHandle.WaitOne();// 确保写入完成fs.EndWrite(result);}Console.WriteLine("数据已异步写入文件!");}
}

2)异步读取

使用 BeginReadEndRead 方法可以实现异步读取。

class Program
{static void Main(){// 文件路径string path = "example.txt";using (FileStream fs = new FileStream(path, FileMode.Open)){// 创建字节数组,用于存储读取到的数据byte[] data = new byte[fs.Length];// 异步读取数据IAsyncResult result = fs.BeginRead(data, 0, data.Length, null, null);result.AsyncWaitHandle.WaitOne();// 确保读取完成int bytesRead = fs.EndRead(result);// 输出读取到的数据Console.WriteLine("异步读取到的数据:");Console.WriteLine(System.Text.Encoding.UTF8.GetString(data, 0, bytesRead));}}
}

3)异步操作最佳实践

async Task ProcessLargeFile()
{byte[] buffer = new byte[4096];using var fs = new FileStream("bigfile.dat", FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true);while(true){int read = await fs.ReadAsync(buffer, 0, buffer.Length);if(read == 0) break;// 处理数据}
}
// 异步读取
public async Task ReadAsync()
{using (FileStream fs = new FileStream("data.bin", FileMode.Open, FileAccess.Read)){byte[] buffer = new byte[4];await fs.ReadAsync(buffer, 0, buffer.Length);}
}

2. 性能优化

性能优化策略:

  1. 异步IO优先:充分利用现代存储设备的并行能力
  2. 合理缓冲区:根据访问模式调整bufferSize参数
  3. 顺序访问标记:设置FileOptions.SequentialScan
  4. 避免频繁开关:保持流打开处理批量操作
  5. 使用内存映射:处理超大文件时效率倍增
  6. 释放及时:及时Dispose释放系统资源

1)缓冲区优化

通过 SetLengthLength 属性管理文件大小,或通过 BufferSize 构造参数调整缓冲区大小:

// 创建带自定义缓冲区的流(默认 4KB)
using (FileStream fs = new FileStream("data.bin", FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 8192))
{// 缓冲区大小为 8KB
}
var fs = new FileStream("prealloc.dat", FileMode.Create);
fs.SetLength(1024 * 1024 * 1024);  // 预分配1GB空间

2)大文件处理

▶ 分块读写

避免一次性加载大文件到内存:

using (FileStream fs = new FileStream("large_file.bin", FileMode.Open, FileAccess.Read))
{byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0){// 处理 buffer 的前 bytesRead 字节}
}
▶ 内存映射文件(Memory-Mapped Files)

通过 MemoryMappedFile 处理超大文件(超高性能场景):

using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile("large_file.bin", FileMode.Open))
{using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor()){byte[] buffer = new byte[1024];accessor.ReadArray(0, buffer, 0, buffer.Length); // 读取前 1KB}
}
▶ 混合缓冲策略
// 禁用系统缓冲(适用于SSD)
var fs = new FileStream("ssd.bin", FileOptions.WriteThrough);

3. 与二进制类结合使用

  • 通过 BinaryReader/BinaryWriter 简化二进制数据操作:
    // 写入二进制数据
    using (FileStream fs = new FileStream("data.bin", FileMode.Create))
    using (BinaryWriter writer = new BinaryWriter(fs))
    {writer.Write(42); // 写入 intwriter.Write(3.14f); // 写入 float
    }
    

4. 实际应用场景示例

示例1:大文件分块处理

避免一次性加载大文件导致内存溢出:

using (var fs = new FileStream("4GB_video.mp4", FileMode.Open, FileAccess.Read)) 
{byte[] chunk = new byte[1024 * 1024];  // 1MB分块while (fs.Position < fs.Length) {int read = fs.Read(chunk, 0, chunk.Length);// 处理当前分块(如加密/压缩)}
}

示例2:二进制文件解析

解析PNG文件头示例:

using (var fs = new FileStream("image.png", FileMode.Open)) 
{byte[] header = new byte[8];fs.Read(header, 0, 8);if (header[0] == 0x89 && header[1] == 0x50) {  // 检测PNG魔数Console.WriteLine("Valid PNG file");}
}

示例3:异步高性能写入

利用异步模式提升吞吐量:

async Task WriteLogAsync(string message) 
{using (var fs = new FileStream("app.log", FileMode.Append, FileAccess.Write, FileShare.None, 4096, FileOptions.Asynchronous)) {byte[] data = Encoding.UTF8.GetBytes(message + "\n");await fs.WriteAsync(data, 0, data.Length);}
}

示例4:断点续传实现

class FileResume
{private long _currentPosition;public void ResumeDownload(string url, string localPath){using var fs = new FileStream(localPath, FileMode.OpenOrCreate, FileAccess.Write);_currentPosition = fs.Length;fs.Seek(_currentPosition, SeekOrigin.Begin);// 从指定位置下载网络文件DownloadFromPosition(url, _currentPosition);}
}

四、常见问题与注意事项

1. 常见问题

1)文件被占用导致异常

问题:尝试打开文件时抛出 IOException,提示文件被其他进程占用。
解决

  • 使用 FileShare 参数允许共享访问:
    new FileStream("file.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    
  • 确保其他进程已释放文件资源。

2)权限不足

问题:无权读写指定路径的文件。
解决

  • 检查文件路径的访问权限(如 NTFS 权限)。
  • 以管理员身份运行程序(Windows)。

3)文件指针越界

问题:尝试读取或写入超出文件长度的位置。
解决

  • 使用 Seek 方法前检查文件长度:
    if (fs.Position + 10 > fs.Length)
    {throw new ArgumentOutOfRangeException("超出文件范围");
    }
    

2. 注意事项

1)使用 using 语句

FileStream 实现了 IDisposable 接口,因此建议使用 using 语句来确保资源被正确释放。

using (FileStream fs = new FileStream(path, FileMode.Open))
{// 操作文件流
}

2)处理异常

在文件操作中,可能会遇到各种异常情况,如文件不存在、权限不足等。因此,在使用 FileStream 时,应妥善处理异常。

try
{using (FileStream fs = new FileStream(path, FileMode.Open)){// 操作文件流}
}
catch (FileNotFoundException)
{Console.WriteLine("文件未找到!");
}
catch (IOException)
{Console.WriteLine("发生 I/O 错误!");
}
catch (UnauthorizedAccessException)
{Console.WriteLine("访问被拒绝!");
}

3)编码问题

在处理文本文件时,需要注意编码问题。可以使用 System.Text.Encoding 类来指定编码。

// 以 UTF-8 编码读取文件
byte[] data = File.ReadAllBytes(path);
string text = System.Text.Encoding.UTF8.GetString(data);

4)性能优化

在处理大文件时,可以考虑使用缓冲区来提高性能。大文件处理时建议设置更大的bufferSize

using System;
using System.IO;class Program
{static void Main(){// 文件路径string path = "largefile.txt";// 缓冲区大小int bufferSize = 4096;// 创建 FileStream 对象,以读取模式打开文件using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize)){// 创建缓冲区byte[] buffer = new byte[bufferSize];int bytesRead;// 循环读取数据while ((bytesRead = fs.Read(buffer, 0, bufferSize)) > 0){// 处理缓冲区中的数据string text = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);Console.Write(text);}}}
}

5)文件锁定与并发

  • 使用FileShare.ReadWrite允许多进程共享文件
  • 通过Lock()方法锁定文件区域防止冲突:
    fs.Lock(0, fs.Length);  // 全文件锁定
    // 执行关键操作
    fs.Unlock(0, fs.Length);
    

五、最佳实践总结

1. 资源管理

  • 使用 using 语句:确保流在操作后自动关闭,避免文件被锁定。
  • 避免长生命周期流:不要在长时间运行的代码中保持 FileStream 打开。

2. 异步优先

  • 对于 I/O 密集型操作,优先使用异步方法(如 ReadAsyncWriteAsync),提升程序响应性。

3. 缓冲区调优

  • 根据场景调整缓冲区大小:
    • 小文件:默认 4KB 即可。
    • 大文件:增大缓冲区(如 8KB-64KB)提升性能。

缓冲区配置原则

文件类型推荐缓冲区大小理由
小型文件默认4KB避免内存浪费
大文件顺序读64KB-1MB减少IO次数
随机访问4KB-16KB提高定位准确性

5. 异常处理

  • 捕获 IOExceptionUnauthorizedAccessException 等常见异常:
    try
    {// 文件操作
    }
    catch (IOException ex)
    {Console.WriteLine("IO 错误:" + ex.Message);
    }
    

6. 推荐实践代码

// 完整示例:读写二进制文件
public static async Task ProcessFileAsync()
{// 写入数据using (FileStream fs = new FileStream("data.bin", FileMode.Create, FileAccess.Write))using (BinaryWriter writer = new BinaryWriter(fs)){writer.Write(42); // 写入整数writer.Write("Hello");}// 读取数据using (FileStream fs = new FileStream("data.bin", FileMode.Open, FileAccess.Read))using (BinaryReader reader = new BinaryReader(fs)){int num = reader.ReadInt32(); // 42string text = reader.ReadString(); // "Hello"}
}

结语

回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。

相关文章:

C# FileStream 使用详解

总目录 前言 在 C# 编程中&#xff0c;文件操作是常见的任务之一。FileStream 类是 System.IO 命名空间中的一个重要类&#xff0c;它提供了对文件的读取和写入操作的底层支持。本文将详细介绍 FileStream 的使用方法&#xff0c;包括如何创建、读取、写入文件&#xff0c;以及…...

C++编程语言:抽象机制:一个矩阵的设计(Bjarne Stroustrup)

第29章 一个矩阵的设计(A Matrix Design) 目录 29.1 引言 29.1.1 基本的 Matrix 用法 29.1.2 Matrix 的要求 29.2 一个 Matrix 模板 29.2.1 构造和赋值(Construction and Assignment) 29.2.2 下标和分片(Subscripting and Slicing) 29.3 Matrix算术运算(Matrix…...

Swift LeetCode 246 题解:中心对称数(Strobogrammatic Number)

摘要 在日常开发中&#xff0c;我们经常遇到一些关于对称性的判断&#xff0c;比如字符串回文、镜像翻转等。而 “中心对称数”&#xff08;Strobogrammatic Number&#xff09; 这个问题&#xff0c;本质上是考察一个数字在旋转 180 度后是否还是原来的样子。 这个问题看似简…...

网络安全等级保护测评

名词解释 网络安全等级保护测评 网络安全等级保护测评,是对信息系统进行的一种安全评估活动。它的目的是验证信息系统是否达到了国家网络安全等级保护制度所规定的安全保护要求。这个制度将信息系统按照重要性划分为不同的安全保护等级,每个等级都有相应的安全保护要求。 …...

项目复盘:websocket不受跨域限制的原理

主要还是因为&#xff1a; 1、WebSocket 是独立于 HTTP 的应用层协议&#xff0c;通过 HTTP 建立连接后&#xff0c;完全脱离 HTTP 语义约束。这意味着 不受 HTTP 同源策略限制 不需要预检请求 不依赖 CORS 头机制 2、建立连接时的握手请求仍使用 HTTP 格式&#xff0c;但…...

deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天

一、软件介绍 文末提供下载 deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天&#xff0c;这是一个浏览器扩展&#xff0c;它允许用户公开、私下分享他们的聊天对话&#xff0c;并使用密码或过期链接来增强 Deepseek Web UI。该扩展程序在 Deepseek 界面中添加了一个 “…...

AI原生应用爆发:从通用大模型到垂直场景的算力重构

2025年第一季度&#xff0c;中国AI产业迎来标志性转折点&#xff1a;DeepSeek-R1大模型月活用户突破3000万&#xff0c;通义千问QwQ-32B在医疗领域诊断准确率达三甲医院主治医师水平&#xff0c;京东AI虚拟模特单日生成商品图超200万张……这些数据的背后&#xff0c;是AI技术从…...

arcgis jsapi 4.31 调用geoserver 发布的wms服务

服务的调用我也测试了网络搜索的很多方法&#xff0c;均未奏效&#xff0c;后来还是通过对官网例子的研究&#xff0c;找到了解决方案&#xff0c;调试的过程是非常痛苦的&#xff0c;最大的问题就是调用后没有任何反应&#xff0c;也不会给你任何的错误信息&#xff0c;这是最…...

《筋斗云的K8s容器化迁移》

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 文章目录 **第一章&#xff1a;斗战胜佛的延迟焦虑****第二章&#xff1a;微服务化的紧箍咒****第三章&#xff1a;混沌中的流量劫持****第四章&#xff1a;量子筋斗的终极形态****终章&…...

[笔记.AI]大模型训练 与 向量值 的关系

&#xff08;借助 DeepSeek-V3 辅助生成&#xff09; 大模型在训练后是否会改变向量化的值&#xff0c;取决于模型的训练阶段和使用方式。以下是详细分析&#xff1a; 1. 预训练阶段&#xff1a;向量化值必然改变 动态调整过程&#xff1a; 在预训练阶段&#xff08;如BERT、…...

【学Rust写CAD】18 定点数2D仿射变换矩阵结构体(MatrixFixedPoint结构别名)

源码 // matrix/fixed.rs use crate::fixed::Fixed; use super::generic::Matrix;/// 定点数矩阵类型别名 pub type MatrixFixedPoint Matrix<Fixed, Fixed, Fixed, Fixed, Fixed, Fixed>;代码解析 这段代码定义了一个定点数矩阵的类型别名 MatrixFixedPoint&#xff…...

Linux进程间通信:【目的】【管道】【匿名管道】【命名管道】【System V 共享内存】

目录 一.进程间通信目的 二.管道 三.匿名管道 3.1用fork来共享管理管道 3.2站在文件描述符角度-深度理解管道 3.3内核角度 3.4管道样例 3.4.1测试管道读写 3.4.2代码 解决方案1&#xff1a;倒着关闭&#xff1a; 解决方案2&#xff1a; 只让父进程一个人指向写端 四…...

Python 自动化:节省时间,更智能地工作

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 时间是你最宝贵的资产。如果你花费数小时手动执行重复性任务&#xff0c;那么当 Python 可以为你完成这些任务时&#xff0c;你就是在浪费时…...

StarRocks的执行计划和Profile

文章目录 一、执行计划和Profile相关脚本二、如何分析查询1、概念了解2、Query Plan①查看 Query Plan②分析 Query Plan 3、Query hint4、Query Profile①启用 Query Profile②查看 Query Profile③分析 Query Profile 一、执行计划和Profile相关脚本 命令功能ANALYZE PROFIL…...

【设计模式】过滤器模式

过滤器顾名思义&#xff0c;定义一些过滤规则&#xff0c;将符合要求的内容筛选&#xff0c;就比如过滤不同大小或者不同颜色的水果&#xff0c;需要颜色和大小过滤器&#xff0c;筛选条件独立为对象&#xff0c;可以通过灵活组合形成过滤链条。避免大量使用判断语句。 案例代…...

Jenkins插件安装失败如何解决

问题&#xff1a;安装Jenkins时候出现插件无法安装的情况。 测试环境&#xff1a; 操作系统&#xff1a;Windows11 Jenkins&#xff1a;2.479.3 JDK&#xff1a;17.0.14&#xff08;21也可以&#xff09; 解决办法一&#xff1a; 更换当前网络&#xff0c;局域网、移动、联通…...

GO语言杂记(文章持续更新)

1、MAIN冲突 在一个文件夹下有两个go文件同时写了main函数&#xff0c;将会报错&#xff0c;main函数只能在main包中。 实则不然&#xff0c;有些环境下并不会报错。 2、gofmt命令---自动对齐 命令作用&#xff1a;将go文件代码自动缩进。 gofmt -w escapecharprac.go...

VUE如何前端控制及动态路由详细讲解

在Vue.js中&#xff0c;前端控制通常指的是通过Vue的响应式系统、组件化、路由、状态管理等技术来实现对前端应用的控制和管理 一、前端路由控制基础 使用 vue-router 管理路由&#xff0c;通过路由守卫和动态添加路由实现权限控制。 1. 安装和配置 npm install vue-router…...

【区块链安全 | 第九篇】基于Heimdall设计的智能合约反编译项目

文章目录 背景目的安装1、安装 Rust2、克隆 heimdall-dec3、编译 heimdall-dec4、运行 heimdall-dec 使用说明1、访问 Web 界面2、输入合约信息3、查看反编译结果 实战演示1、解析普通合约2、解析代理合约 背景 在区块链安全研究中&#xff0c;智能合约的审计和分析至关重要。…...

day1_Flink基础

文章目录 Flink基础今日课程内容目标为什么要学Flink技术更新迭代市场需求 流式计算批量计算概念特点 批量计算的优势和弊端流式计算生活中流场景流式计算的概念 Flink简介Flink历史Flink介绍 Flink架构体系已学过的框架技术Flink架构 Flink集群搭建Flink的集群模式Standalone模…...

43页可编辑PPT | 大数据管理中心设计规划方案大数据中心组织架构大数据组织管理

这份文档是一份关于大数据管理中心规划设计方案的详细报告&#xff0c;涵盖了背景与需求分析、整体规划方案、关键能力实现方案以及实施方案等内容。报告强调大数据在城市治理中的重要性&#xff0c;提出通过构建统一的大数据平台&#xff0c;整合城市各部门数据资源&#xff0…...

JavaScript数据结构

目录 JavaScript数据结构 一、基础数据结构 1. 数组&#xff08;Array&#xff09; 2. 对象&#xff08;Object&#xff09; 二、ES6 高级数据结构 1. Map 2. Set 3. WeakMap 与 WeakSet 三、类型化数组&#xff08;Typed Arrays&#xff09; 四、其他数据结构实现 …...

如何使用 FastAPI 构建 MCP 服务器

哎呀&#xff0c;各位算法界的小伙伴们&#xff01;今天咱们要聊聊一个超酷的话题——MCP 协议&#xff01;你可能已经听说了&#xff0c;Anthropic 推出了这个新玩意儿&#xff0c;目的是让 AI 代理和你的应用程序之间的对话变得更顺畅、更清晰。不过别担心&#xff0c;为你的…...

Js 主线程和异步队列哪个先执行

JavaScript 主线程与异步队列执行顺序详解 JavaScript 是单线程语言&#xff0c;通过事件循环&#xff08;Event Loop&#xff09;机制来处理同步和异步任务。以下是主线程与异步队列的执行顺序解析&#xff1a; 1. 执行顺序基本原则 console.log(1. 主线程同步任务);setTim…...

C#实现HTTP服务器:处理文件上传---解析MultipartFormDataContent

完整项目托管地址&#xff1a;https://github.com/sometiny/http HTTP还有重要的一块&#xff1a;文件上传。 这篇文章将详细讲解下&#xff0c;前面实现了同一个链接处理多个请求&#xff0c;为了方便&#xff0c;我们独立写了一个HTTP基类&#xff0c;专门处理HTTP请求。 ht…...

【hadoop】远程调试环境

根据上一节&#xff0c;我们已经安装完成hadoop伪分布式环境 hadoop集群环境配置_jdk1.8 441-CSDN博客 还没安装的小伙伴可以看看这个帖子 这一节我们要实现使用vscode进行远程连接&#xff0c;并且完成java配置与测试 目录 vscode 配置远程 安装java插件 新建java项目 …...

检索增强生成(RAG):强化 AI 智能体的知识 “武装”

技术点目录 第一章、智能体(Agent)入门第二章、基于字节Coze 构建智能体(Agent)第三章、基于其他平台构建智能体&#xff08;Agent&#xff09;第四章、国内外智能体(Agent)经典案例详解第五章、大语言模型应用开发框架LangChain入门第六章、基于LangChain的大模型API接入第七章…...

使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例

1. 使用 Provider 实现局部刷新 示例 1&#xff1a;ChangeNotifier Consumer 通过 ChangeNotifier 和 Consumer 实现局部刷新。 import package:flutter/material.dart; import package:provider/provider.dart;void main() {runApp(ChangeNotifierProvider(create: (_) &g…...

notepad++ 正则表达式

注意&#xff1a;Notepad正则表达式字符串最长不能超过69个字符 \ 转义字符 如&#xff1a;要使用 “\” 本身, 则应该使用“\\” \t Tab制表符 注&#xff1a;扩展和正则表达式都支持 \r 回车符CR 注&#xff1a;扩展支持&#xff0c;正则表达式不支持 \n 换行符…...

一起学大语言模型-通过ollama搭建本地大语言模型服务

文章目录 Ollama的github地址链接安装下载需求配置更改安装目录安装更改下载的模型存储位置Ollama一些目录说明日志目录 运行一个模型测试下测试下更改服务监听地址和端口号 Ollama的github地址链接 https://github.com/ollama/ollama 安装 下载 mac安装包下载地址&#xff1…...

webpack配置详解+项目实战

webpack在vue中的配置&#xff0c;适合想重新认知webpack的你 webpack配置-初级配置 1、配置入口和出口文件 2、配置loader 3、配置eslint&#xff08;可组装js、jsx检查工具&#xff09; 4、配置babel&#xff08;将高级的js语法转换成低版本的js语法&#xff09; 5、使用 ht…...

【学习笔记】文件上传漏洞--js验证、mime验证、.user.ini、短标签、过滤、文件头

概念 文件上传漏洞 什么是文件上传漏洞&#xff1f; 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷&#xff0c;而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。 这里上传的文件可以是木马&#xff0c;病毒&#xff0c;恶意脚…...

经典卷积神经网络LeNet实现(pytorch版)

LeNet卷积神经网络 一、理论部分1.1 核心理论1.2 LeNet-5 网络结构1.3 关键细节1.4 后期改进1.6 意义与局限性二、代码实现2.1 导包2.1 数据加载和处理2.3 网络构建2.4 训练和测试函数2.4.1 训练函数2.4.2 测试函数2.5 训练和保存模型2.6 模型加载和预测一、理论部分 LeNet是一…...

【VM虚拟机ip问题】

我就是我&#xff0c;不一样的烟火。 文章目录 前言一、启动VM虚拟机1. 开启虚拟机2. 输入账号密码登录3. 依次输入指令 二、主机ping地址测试1. ping ip地址-成功 三、安装-MobaXterm_Personal_21.51. 点击Session2. 选择SSH连接3. 输入信息4. 首次进入5. 连接成功 总结 前言 …...

【计算机视觉】YOLO语义分割

一、语义分割简介 1. 定义 语义分割&#xff08;Semantic Segmentation&#xff09;是计算机视觉中的一项任务&#xff0c;其目标是对图像中的每一个像素赋予一个类别标签。与目标检测只给出目标的边界框不同&#xff0c;语义分割能够在像素级别上区分不同类别&#xff0c;从…...

【C++游戏引擎开发】《线性代数》(3):矩阵乘法的SIMD优化与转置加速

一、矩阵乘法数学原理与性能瓶颈 1.1 数学原理 矩阵乘法定义为:给定两个矩阵 A ( m n ) \mathrm{A}(mn) A(mn)和 B ( n p ) \mathrm{B}(np) B(np),它们的乘积 C = A B \mathrm{C}=AB C=AB 是一个 m p \mathrm{m}p mp 的矩阵,其中: C i , j = ∑ k = 1…...

聚焦交易能力提升!EagleTrader 模拟交易系统打造交易成长新路径

在全球市场波动加剧的背景下&#xff0c;交易者面临的挑战已不仅限于技术分析层面。许多交易者在实盘操作中常因情绪干扰导致决策变形&#xff0c;如何构建科学的交易心理与风险控制体系成为行业关注焦点。 国内自营交易考试EagleTrader运用自己研发的模拟交易系统&#xff0c…...

文件分片上传

1前端 <inputtype"file"accept".mp4"ref"videoInput"change"handleVideoChange"style"display: none;">2生成hash // 根据整个文件的文件名和大小组合的字符串生成hash值&#xff0c;大概率确定文件的唯一性fhash(f…...

C#Lambda表达式与委托关系

1. 核心关系图示 A[委托] --> B[提供方法容器] B --> C[Lambda表达式] C --> D[委托实例的语法糖] A --> E[类型安全约束] C --> F[编译器自动生成委托实例] 2. 本质联系 2.1 类型关系 ‌Lambda表达式‌是编译器生成的‌委托实例‌表达式自动匹配符合签名的…...

机器翻译和文本生成评估指标:BLEU 计算公式

&#x1f4cc; BLEU 计算公式 BLEU 主要由**n-gram精确匹配率&#xff08;Precision&#xff09;和长度惩罚&#xff08;Brevity Penalty, BP&#xff09;**组成。 1️⃣ n-gram 精确匹配率 计算不同长度的 n-gram&#xff08;1-gram, 2-gram, ..., n-gram&#xff09;在生成…...

24 python 类

在办公室里&#xff0c;类就像一个部门&#xff08;如销售部、财务部&#xff09;&#xff0c;定义了该部门员工的共同属性&#xff08;姓名、职位&#xff09;和行为&#xff08;处理客户、提交报表&#xff09;。 一、面向对象技术简介 作为一个要入门码农的牛马&#xff0…...

pycharm与python版本

python 3.6-3.9 pycharm 2021版本搭配最好 python 3.8 pycharm 2019版本搭配最好 pycharm各版本下载...

23种设计模式-结构型模式-外观

文章目录 简介问题解决方案示例代码总结 简介 也称&#xff1a;门面模式、Facade。外观是一种结构型设计模式&#xff0c;能为程序库、框架或其他复杂类提供一个简单的接口。 问题 假设你必须在代码中使用某个复杂的库或框架中的众多对象。正常情况下&#xff0c;你需要负责…...

open3d教程 (三)点云的显示

官方文档位置&#xff1a; Visualization - Open3D 0.19.0 documentationhttps://www.open3d.org/docs/release/tutorial/visualization/visualization.html核心方法&#xff1a; o3d.visualization.draw_geometries([几何对象列表]) import open3d as o3dprint("Load …...

node.js、npm相关知识

Node.js 是一个基于 Chrome V8 JavaScript 引擎 构建的开源、跨平台的 JavaScript 运行时环境&#xff0c;主要用于服务器端编程。它允许开发者使用 JavaScript 编写高性能的后端服务&#xff0c;突破了 JavaScript 仅在浏览器中运行的限制。 npm&#xff08;Node Package Man…...

大象如何学会太空漫步?美的:科技领先、To B和全球化

中国企业正处在转型的十字路口。一边是全新的技术、全新的市场机遇&#xff1b;一边是转型要面临的沉重负累和巨大投入&#xff0c;无数中国制造、中国品牌仍在寻路&#xff0c;而有的人已经走至半途。 近日&#xff0c;美的集团交出了一份十分亮眼的2024年财报。数据显示&…...

Go红队开发— 收官工具

文章目录 免责声明个人武器开发美观输出Whois查询反查ip目录扫描子域名爆破被动扫描主动扫描(字典爆破)CDN检测 免责声明 &#x1f4a1; 本博客绝不涉及任何非法用途。 &#x1f4a1; 使用者风险自担&#xff0c;违规后果自负。 &#x1f4a1; 守法为先&#xff0c;技术向善。 …...

Android 应用程序包的 adb 命令

查看所有已安装应用的包名 命令&#xff1a;adb shell pm list packages说明&#xff1a;该命令会列出设备上所有已安装应用的包名。可以通过管道符|结合grep命令来过滤特定的包名&#xff0c;例如adb shell pm list packages | grep com.pm&#xff0c;这将只显示包名中包含co…...

北京南文观点:后糖酒会营销,以战略传播重构品牌信心坐标

第112届全国糖酒会落下帷幕&#xff0c;参展品牌面临一个关键命题。如何在流量洪流中沉淀品牌价值&#xff1f;北京南文&#xff08;全称&#xff1a;南文乐园科技文化&#xff08;北京&#xff09;有限公司&#xff09;认为&#xff0c;糖酒会的结束恰是算法时代品牌认知战的真…...

Qt - findChild

findChild 1. 函数原型2. 功能描述3. 使用场景4. 示例代码5. 注意事项6. 总结 在 Qt 中&#xff0c;每个 QObject 都可以拥有子对象&#xff0c;而 QObject 提供的模板函数 findChild 就是用来在对象树中查找满足特定条件的子对象的工具。下面我们详细介绍一下它的使用和注意事…...