FileStream的使用

article/2025/9/27 6:54:42

FileStream的使用

一.基本介绍:
![在这里插入图片描述](https://img-blog.csdnimg.cn/594d460eadb94bb3ab14761371a6e21a.png
二.FileStream读写文件实例:

string path1 = @"d\test\test1.txt";string path2= @"d\test\test2.txt";byte[] buffered = new byte[1024];using (FileStream fsr = new FileStream(path1, FileMode.Open, FileAccess.Read)) {using (FileStream fsw = new FileStream(path1, FileMode.OpenOrCreate, FileAccess.Write)) {int count = fsr.Read(buffered, 0, buffered.Length);while (true) {if (count == 0) break;fsw.Write(buffered, 0, buffered.Length);}}}

三.FileStream异步复制文件:
第一种方式: 不建议,复杂

        private static FileStream inputS = null;private static FileStream OutputS = null;private static int bufferSize = 1024;private static byte[] buffered = new byte[1024];static void Main(string[] args){string path = @"d:\test1\test.txt";Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}");ReadAsync01(path);}public static void ReadAsync01(string path) {Console.WriteLine($"异步读取:{Thread.CurrentThread.ManagedThreadId}");inputS = new FileStream(path, FileMode.Open, FileAccess.Read,FileShare.Read,buffered.Length,true);inputS.BeginRead(buffered, 0, buffered.Length, OnCompleteRead, null);}//异步回调的方法private static void OnCompleteRead(IAsyncResult asyncResult) {Console.WriteLine($"异步回调{Thread.CurrentThread.ManagedThreadId}");//读取的字节数据int count =inputS.EndRead(asyncResult);string writePath = @"d:\test2\test2.txt";if (count > 0) {if (count < bufferSize){WriteAsync01(writePath, count);inputS.Close();}elseinputS.BeginRead(buffered, 0, buffered.Length, OnCompleteRead, null);}}public static void WriteAsync01(string path,int len){Console.WriteLine($"异步写入:{Thread.CurrentThread.ManagedThreadId}");byte[] buffered = new byte[1024];OutputS = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.None, buffered.Length, true);OutputS.BeginWrite(buffered, 0, buffered.Length, OnCompleteRead, null);OutputS.Close();}//异步回调的方法private static void OnCompleteQWrite(IAsyncResult asyncResult){Console.WriteLine($"异步回调{Thread.CurrentThread.ManagedThreadId}");inputS.EndWrite(asyncResult);}}

第二种方式:

   private string pathr = @"d:\test1\test1.txt";  private string pathw = @"d:\test2\test2.txt";  private int  bufferSize= 1024;  public  async void read() {Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}");await ReadFileAsync();Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}");}public async Task ReadFileAsync() {Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}");byte[] buffered = new byte[bufferSize];using (FileStream fis = new FileStream(pathr, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, true)) {using (FileStream fws = new FileStream(pathw, FileMode.Open, FileAccess.Write, FileShare.None, bufferSize, true)) {int count = 0;count= await fis.ReadAsync(buffered, 0, buffered.Length);while (count != 0) {await fws.WriteAsync(buffered, 0, count);count = await fis.ReadAsync(buffered, 0, buffered.Length);}}}}

四.MemoryStream的使用:
①.基本介绍:
在这里插入图片描述
②主要的构造函数:

    //// 摘要://     使用初始化为零的可扩展容量初始化 System.IO.MemoryStream 类的新实例。public MemoryStream();//// 摘要://     使用按指定要求初始化的可扩展容量初始化 System.IO.MemoryStream 类的新实例。//// 参数://   capacity://     内部数组的初始大小(以字节为单位)。//// 异常://   T:System.ArgumentOutOfRangeException://     capacity 为负数。public MemoryStream(int capacity);//// 摘要://     基于指定的字节数组初始化 System.IO.MemoryStream 类的无法调整大小的新实例。//// 参数://   buffer://     从中创建当前流的无符号字节数组。//// 异常://   T:System.ArgumentNullException://     buffer 为 null。public MemoryStream(byte[] buffer);//// 摘要://     在 System.IO.MemoryStream.CanWrite 属性按指定设置的状态下,基于指定的字节数组初始化 System.IO.MemoryStream//     类的无法调整大小的新实例。//// 参数://   buffer://     从中创建此流的无符号字节的数组。////   writable://     System.IO.MemoryStream.CanWrite 属性的设置,确定该流是否支持写入。//// 异常://   T:System.ArgumentNullException://     buffer 为 null。public MemoryStream(byte[] buffer, bool writable);//// 摘要://     基于字节数组的指定区域(索引)初始化 System.IO.MemoryStream 类的无法调整大小的新实例。//// 参数://   buffer://     从中创建此流的无符号字节的数组。////   index://     buffer 内的索引,流从此处开始。////   count://     流的长度(以字节为单位)。//// 异常://   T:System.ArgumentNullException://     buffer 为 null。////   T:System.ArgumentOutOfRangeException://     index 或 count 也不可小于零。////   T:System.ArgumentException://     缓冲区长度减去 index 小于 count。public MemoryStream(byte[] buffer, int index, int count);//// 摘要://     在 System.IO.MemoryStream.CanWrite 属性按指定设置的状态下,基于字节数组的指定区域,初始化 System.IO.MemoryStream//     类的无法调整大小的新实例。//// 参数://   buffer://     从中创建此流的无符号字节的数组。////   index://     buffer 内的索引,流从此处开始。////   count://     流的长度(以字节为单位)。////   writable://     System.IO.MemoryStream.CanWrite 属性的设置,确定该流是否支持写入。//// 异常://   T:System.ArgumentNullException://     buffer 为 null。////   T:System.ArgumentOutOfRangeException://     index 或 count 为负。////   T:System.ArgumentException://     缓冲区长度减去 index 小于 count。public MemoryStream(byte[] buffer, int index, int count, bool writable);//// 摘要://     在 System.IO.MemoryStream.CanWrite 属性和调用 System.IO.MemoryStream.GetBuffer 的能力按指定设置的状态下,基于字节数组的指定区域初始化//     System.IO.MemoryStream 类的新实例。//// 参数://   buffer://     从中创建此流的无符号字节的数组。////   index://     buffer 内的索引,流从此处开始。////   count://     流的长度(以字节为单位)。////   writable://     System.IO.MemoryStream.CanWrite 属性的设置,确定该流是否支持写入。////   publiclyVisible://     设置为 true 可以启用 System.IO.MemoryStream.GetBuffer,它返回无符号字节数组,流从该数组创建;否则为 false。//// 异常://   T:System.ArgumentNullException://     buffer 为 null。////   T:System.ArgumentOutOfRangeException://     index 或 count 为负数。////   T:System.ArgumentException://     缓冲区长度减去 index 小于 count。public MemoryStream(byte[] buffer, int index, int count, bool writable, bool publiclyVisible);

③.基本使用

   public void MemoryStreamEx() {MemoryStream memoryStream0 = new MemoryStream();MemoryStream memoryStream1 = new MemoryStream(1024);byte[] buffered = new byte[1024 * 1024];MemoryStream memoryStream2 = new MemoryStream(buffered);//操作memoryStream0.Read(buffered, 0, buffered.Length);memoryStream1.Write(buffered, 0, buffered.Length);//SeekOrigin.Begin//SeekOrigin.Current;//SeekOrigin.End;memoryStream2.Seek(2, SeekOrigin.Begin);  //指定流的开始位置 设置新的位置using (FileStream fws = new FileStream(pathw, FileMode.Open, FileAccess.Write, FileShare.None, buffered.Length)) {memoryStream0.WriteTo(fws);  //将缓冲区中的数据写入到文件中  持久化的过程}}

总结:
今天我们主要介绍的是关于文件流FileStream的读写操作以及基于内存的MemoryStream,并通过以上这两种方式我们都实现了对于文件的异步复制,但是我们可以明显看出第二种方式的优势:简单明了并且易于理解且性能优于第一种,下次我们将会带来BufferedStream的基本介绍以及使用!


http://chatgpt.dhexx.cn/article/jy1KWjTI.shtml

相关文章

C#中File和FileStream的用法

在近期的工作过程中发现自己的基础比较薄弱&#xff0c;所以最近在恶补基础知识。下面就对我所学习的File类和FileStream进行简单的总结。1.首先先介绍File类和FileStream文件流 1.1 File类&#xff0c;是一个静态类&#xff0c;支持对文件的基本操作&#xff0c;包括创建&am…

FileStream 总结

FileStream 如何去理解FileStream? 我们磁盘的中任何文件都是通过2进制组成&#xff0c;最为直观的便是记事本了&#xff0c;当我们新建一个记事本时&#xff0c;它的大小是0KB, 我们每次输入一个数字或 字母时文件便会自动增大4kb,可见随着我们输入的内容越来越多&#xff…

FileStream读写文件

FileStream读写文件 FileStream类:操作字节的&#xff0c;可以操作任何的文件 StreamReader类和StreamWriter类:操作字符的&#xff0c;只能操作文本文件。 1、FileStream类 FileStream类 命名空间: System.IO &#xff08;1&#xff09;构造函数&#xff1a; FileStre…

本地socket unix domain socket

socket API原本是为网络通讯设计的&#xff0c;但后来在socket的框架上发展出一种IPC机制&#xff0c;就是UNIXDomain Socket。虽然网络socket也可用于同一台主机的进程间通讯&#xff08;通过loopback地址127.0.0.1&#xff09;&#xff0c;但是UNIX Domain Socket用于IPC更有…

python中socks包(SocksiPy)的安装、使用方法简介

1、下载SocksiPy csdn地址&#xff1a;点击打开https://download.csdn.net/download/qq_27378621/10536690 官方地址&#xff1a;点击打开https://sourceforge.net/projects/socksipy/?sourcetyp_redirect 2、官方文档介绍 地址&#xff1a;点击打开http://socksipy.sourc…

SOCKS5实现(一)

引文 假如我有一部安卓手机&#xff0c;我想把手机上的全部流量打到指定的代理上&#xff08;即透明代理&#xff09;&#xff0c;代理外接外部的VPN&#xff0c;以达到分散IP出口的目的。 这是这个系列的第一篇文章&#xff0c;本文将简单介绍一下 SOCKS 、iptable 、透明代理…

socks协议详解

0x01 socks协议简介 Socks&#xff08;Socket Secure&#xff09;协议是一种网络协议&#xff0c;处于会话层&#xff0c;用于管理网络连接并提供安全性和隐私保护。通过使用Socks代理服务器&#xff0c;客户端可以隐藏其真实IP地址和其他身份信息&#xff0c;从而匿名地访问互…

socks代理实战

文章目录 Socks代理实战Socks代理简介Socks代理工具Socks代理实战-MSF渗透场景Target1Target2Target3 Socks代理实战-FRPTarget1Target2Target3 Socks代理实战-EWEW使用简介EW正反向Socks代理EW创建一层Socks代理二级级联本地SocksEW创建二层Socks代理三级级联的本地SocksEW创建…

Socket(四)

文章目录 1. 服务器Socket简介2. 使用ServerSocket3. 用Socket写入服务器4. 关闭服务器Socket 1. 服务器Socket简介 博客Socket&#xff08;一&#xff09;&#xff5e;Socket&#xff08;二&#xff09;从客户端的角度讨论了Socket&#xff0c;客户端就是向监听连接的服务器打…

CobaltStrike建立Socks4代理

目录 Socks4代理建立 ProxyChains的使用 Socks4代理建立 当我们的被控主机是位于公网和内网边界的服务器时&#xff0c;我们想利用该主机继续对内网的主机进行渗透&#xff0c;比如经过端口扫描我们发现被控机器的同一网段有一主机开放了80端口&#xff0c;我们想在本地访问…

Java常用工具类

学习内容 包装类型(基本数据类型的包装类型) String字符串常用方法 StringBuffer与Stringbuilder 日期和时间处理工具类 System,Math,Random,UUID等工具类 枚举类型 File类 递归算法 目录 1.包装类型 1.1.Integer的基本用法 1.2.包装类型的使用 1.3.自动装箱与自动…

Java——Collections工具类

Collections工具类 Collections 是一个操作 Set、List 和 Map 等集合的工具类 Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作&#xff0c;还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。 排序操作&#xff1a;&#xff08;均为…

Spring自带的工具类

最近发现同事写了不少重复的工具类&#xff0c;发现其中很多功能&#xff0c;Spring 自带的都有。于是整理了本文&#xff0c;希望能够帮助到大家&#xff01; 目录 断言 对象、数组、集合 ObjectUtils StringUtils CollectionUtils 文件、资源、IO 流 FileCopyUtils R…

【常用工具类】Java控制台打印工具类LogUtil

文章目录 1 带分割线版2 不带分割线版3 终极版 1 带分割线版 import java.text.SimpleDateFormat; import java.util.Date;/*** W SKH 的输出工具类*/ public class LogUtil {private SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-MM-dd,HH:mm:ss.SSS&…

Java 对象拷贝工具类

目录 1. Spring 中的对象拷贝 2. 本工具类中的对象拷贝 2.1 拷贝对象本身&#xff08;单个&#xff09; 2.2 拷贝对象本身&#xff08;批量&#xff09; 2.3 拷贝对象属性至其他类&#xff08;单个&#xff09; 2.4 拷贝对象属性至其他类&#xff08;批量&#xff09; 4.…

Java表达式运算工具类

对于表达式的运算转换工具类&#xff0c;使用场景&#xff0c;例如前端文本框让用户输入了加减乘除运算&#xff0c;工具类智能转换。 资源下载&#xff1a;Java表达式工具类&#xff0c;用于加减乘除等智能转换-Java文档类资源-CSDN下载 例如&#xff1a; public static void…

阿里OSS工具类

参考博客&#xff1a;阿里OSS入门 bucket配置信息&#xff1a;alios.properties OSS配置文件&#xff1a;AliOSSConfig.java Data public class AliOSSConfig {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketNam…

Guava Lists工具类

文章目录 01 概述02 Lists工具类03 文末 01 概述 Guava 是 Google 开源的一个 Java 工具库&#xff0c;里面有很多工具类&#xff0c;本文要讲的是里面的Lists工具类。 注意&#xff0c;使用Guava工具类库&#xff0c;必须先添加依赖&#xff1a; <dependency><gro…

JAVA之常用的工具类

目录 1 集合工具类 1.1 java.util.Collections 1.1.1 基本操作 1.1.2 转换线程安全集合 1.2 org.springframework.util.CollectionUtils 1.3 org.apache.commons.collections.CollectionUtils 1.4 org.apache.commons.lang.ArrayUtils 1.5 org.apache.commons.lang3.Ar…

常用的Java开发工具类

前言 在java的庞大体系中&#xff0c;其实有很多不错的小工具&#xff0c;也就是我们平常说的&#xff1a;轮子。 如果在我们的日常工作当中&#xff0c;能够将这些轮子用户&#xff0c;再配合一下idea的快捷键&#xff0c;可以极大得提升我们的开发效率。 今天我决定把一些…