FileStream读写文件

2023-11-13

FileStream类:操作字节的,可以操作任何的文件

StreamReader类和StreamWriter类:操作字符的,只能操作文本文件。

1、FileStream类

FileStream类

命名空间:   System.IO

(1)构造函数:

  • FileStream(String, FileMode):使用指定的路径和创建模式初始化FileStream 类的新实例。
  • FileStream(String, FileMode, FileAccess):使用指定的路径、创建模式和读/写权限初始化 FileStream 类的新实例。
FileMode 枚举:

  • Append
如果它存在,并且查找到该文件的末尾,或者创建一个新文件,请打开该文件。 这要求 FileIOPermissionAccess.Append 权限。 FileMode.Append 可以仅在结合使用 FileAccess.Write。 尝试查找该文件将引发结束之前将其置于 IOException 异常,并且任何尝试读取失败,将引发 NotSupportedException 异常。
  • Create
指定操作系统应创建一个新的文件。 如果该文件已存在,则会覆盖它。 这要求 FileIOPermissionAccess.Write 权限。 FileMode.Create 等效于请求,如果该文件不存在,则使用 CreateNew; 否则为使用 Truncate。 如果该文件已存在但为隐藏的文件, UnauthorizedAccessException 则会引发异常。
  • CreateNew
指定操作系统应创建一个新的文件。 这要求 FileIOPermissionAccess.Write 权限。 如果该文件已存在, IOException 则会引发异常。
  • Open
指定操作系统应打开现有文件。 若要打开该文件的能力是依赖于指定的值 FileAccess 枚举。 一个 System.IO.FileNotFoundException 如果文件不存在将引发异常。
  • OpenOrCreate
指定操作系统应打开一个文件,是否它存在,则否则,应创建一个新的文件。 如果使用打开该文件 FileAccess.Read,FileIOPermissionAccess.Read 权限是必需的。 如果文件访问是 FileAccess.Write,FileIOPermissionAccess.Write 权限是必需的。 如果使用打开该文件 FileAccess.ReadWrite,这两个 FileIOPermissionAccess.Read 和 FileIOPermissionAccess.Write 权限是必需的。
  • Truncate
指定操作系统应打开现有文件。 当打开文件时,应被截断,以便其大小为零字节。 这要求 FileIOPermissionAccess.Write 权限。 尝试从文件中读取使用打开 FileMode.Truncate 导致 ArgumentException 异常。

FileAccess 枚举:

  • Read:对文件的读取访问权限。 可以从文件读取数据。 将与结合起来 Write 为读/写访问。
  • ReadWrite:读取和写入到文件的访问。 可以写入和从文件中读取数据。
  • Write:对文件的写入访问权限。 数据可以写入该文件。 将与结合起来 Read 为读/写访问
(2)方法
  • public override int Read(byte[] array, int offset, int count);
  • public override void Write(byte[] array, int offset, int count);
  • Dispose():释放由 Stream 使用的所有资源
  • Close()关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。
(3)实例代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;    //FileStream类的命名空间

namespace Filestream读写文件
{
    class Program
    {
        static void Main(string[] args)
        {
            //FileStream 操作字节的
            //1.创建FileStream类对象
            FileStream fsread = new FileStream(@"F:\C#projects\abc.txt",FileMode.OpenOrCreate,FileAccess.Read);
            byte[] buffer=new byte[1024*1024*2];    //定义一个2M的字节数组
            //返回本次实际读取到的有效字节数
            int r=fsread.Read(buffer,0,buffer.Length);    //每次读取2M放到字节数组里面
            //将字节数组中每一个元素按照指定的编码格式解码成字符串
            string s=Encoding.Default.GetString(buffer,0,r);	
            //关闭流
            fsread.Close();
            //释放流所占用的资源
            fsread.Dispose();
            Console.WriteLine(s);  //打印读取到的内容
            Console.ReadKey();
        }
    }
}

结果为:



(4)将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的资源。

(将数据写入文件)代码为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;    //FileStream类的命名空间

namespace Filestream读写文件
{
    class Program
    {
        static void Main(string[] args)
        {
            
            //将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的资源
            using (FileStream fsWrite = new FileStream(@"F:\C#projects\abc.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                string str="看数据会不会被覆盖掉";
                byte[] buffer=Encoding.Default.GetBytes(str);
                fsWrite.Write(buffer, 0, buffer.Length);
            }
            Console.WriteLine("写入完成...");
            Console.ReadKey();
        }
    }
}

运行结果为:


(5)实现多媒体文件的复制

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;    //FileStream类的命名空间

namespace 多媒体文件复制
{
    class Program
    {
        static void Main(string[] args)
        {
            //思路:就是先将要复制的多媒体文件读取出来,然后再写入到指定的地方
            string s_path = @"C:\Users\mei\Desktop\1、复习.avi";   //要读取的文件路径(文件有58.3M)
            string d_path = @"C:\Users\mei\Desktop\new.avi";     //存放的路径
            CopyFile(s_path, d_path);
            Console.WriteLine("复制完成...");
            Console.ReadKey();

        }
        public static void CopyFile(string source,string target)    //自定义文件复制函数
        {
            //创建负责读取的流
            using (FileStream fsread = new FileStream(source, FileMode.Open, FileAccess.Read))
            {
                //创建一个负责写入的流
                using (FileStream fswrite = new FileStream(target, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    byte[] buffer=new byte[1024*1024*5];    //声明一个5M大小的字节数组
                    //因为文件有58.3M,要循环读取
                    while(true)
                    {
                        int r=fsread.Read(buffer, 0, buffer.Length);    //返回本次实际读取到的字节数
                        //如果返回一个0时,也就意味着什么都没有读到,读取完了
                        if(r==0)
                            break;
                        fswrite.Write(buffer,0,r);

                    }
                    
               }

            }
        }
    }
}

运行结果:


2、StreamReader类和StreamWriter类

(1)StreamReader 类

实现一个 TextReader,使其以一种特定的编码从字节流中读取字符。

构造函数:

  • StreamReader(Stream, Encoding)用指定的字符编码为指定的流初始化 StreamReader 类的一个新实例。

属性:

  • EndOfStream获取一个值,该值指示当前的流位置是否在流结尾。

方法:

  • ReadLine():从当前流中读取一行字符并将数据作为字符串返回。(覆盖 TextReader.ReadLine()。)
实例1--使用StreamReader 类读取一个文本文件

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace StreamReader类和StreamWriter类
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用StreamReader来读取一个文本文件
            using (StreamReader sr = new StreamReader(@"F:\C#projects\abc.txt",Encoding.Default))
            {
                while (!sr.EndOfStream)
                {
                    Console.WriteLine(sr.ReadLine());	//读取一行之后,在控制台打印输出
                }
                
            }
            Console.ReadKey();
        }
    }
}

运行结果:


(2)StreamWriter类

实现 TextWriter 用于将字符写入到流中特定的编码。

构造函数:

  • StreamWriter(Stream):新实例初始化 StreamWriter 类为使用 utf-8 编码及默认的缓冲区大小指定的流。
  • StreamWriter(Stream, Encoding):新实例初始化 StreamWriter 为通过使用指定的编码及默认的缓冲区大小指定的流的类。
  • StreamWriter(String, Boolean):新实例初始化 StreamWriter 类为指定的文件使用默认的编码和缓冲区大小。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,此构造函数将创建一个新文件。
方法:

  • Write(String):将字符串写入流。(覆盖 TextWriter.Write(String)。)
实例---使用StreamWriter类向文件中写入内容

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace StreamReader类和StreamWriter类
{
    class Program
    {
        static void Main(string[] args)
        {
           
            //使用StreamWriter来写入一个文本文件,解决乱码使用:System.Text.Encoding.Default
            using (StreamWriter st = new StreamWriter(@"F:\C#projects\abc.txt",true,System.Text.Encoding.Default))
            {
                
                   st.Write("非常好用的类1");
            }
            Console.WriteLine("写入完成...");
            Console.ReadKey();
        }
    }
}

结果:


from: http://blog.csdn.net/liyuqian199695/article/details/70135584



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FileStream读写文件 的相关文章

  • Qt+webservice的多线程实现

    原文地址 https blog csdn net qq 29176963 article details 82776588 相关文章 1 Qt 之 QtSoap 访问WebService https blog csdn net liang1
  • linux lvm在线扩容

    步骤 创建新的PV 将新的PV加入到当前VG 扩容现有LV 扩容文件系统 1 fdisk dev sda n 新增 p 主分区 大小自己调整 可以默认 记得用 t 转换格式为 8e lvm分区号 最后 w 保存 2 partprobe de
  • GitHub访问量超百万的阿里大佬总结图解Java小册火了,完整版限时开源

    什么是Java Java是Sun Microsystems于1995年首次发布的一种编程语言和计算平台 Java是快速 安全和可靠的 从笔记本电脑到数据中心 从游戏机到科学超级计算机 从手机到互联网 Java无处不在 Java的特点 Jav
  • npm依赖更新无效

    项目场景 项目是使用ice 2 0 0搭建的react项目 项目需要替换新版本的sdk 使用npm进行对应sdk的版本升级 问题描述 卸载sdk tnpm uninstall tds sdk 安装最新版本sdk tnpm i tds sdk
  • 互转(经纬度、地心坐标、东北天坐标)

    Part1三种坐标系介绍 经纬度坐标 假设空间某点P 用经纬度表示的话 你们B代表纬度 L代表经度 H代表大地高 纬度B P点沿着地球法线方向与赤道面的夹角 向北为正称为北纬 0 90 向南为负称为南纬 0 90 实际表示可以用 90 90
  • Error:(6, 46) java: 程序包org.springframework.context.annotation不存在

    IDEA 莫名其妙突然出现出错 Error 6 46 java 程序包org springframework context annotation不存在 经本地测试采用如下方法可以解决 1 修改在File gt settings gt Bu
  • MATLAB基础篇——基本语法

    MATLAB基础篇 基本语法 一 数据类型与变量 数据类型 变量 二 矩阵 字符串 三 运算 四 MATLAB常用函数 五 矩阵分析与处理 六 程序设计 七 符号计算 MATLAB Matrix laboratory 一般操作 1 操作界面
  • vue高级篇

    笔记 脚手架文件结构 node modules public favicon ico 页签图标 index html 主页面 src assets 存放静态资源 logo png component 存放组件 HelloWorld vue
  • 算法之路--高斯分布(一)

    正态分布 英语 normal distribution 又名高斯分布 英语 Gaussian distribution 是一个非常常见的连续概率分布 正态分布在统计学上十分重要 经常用在自然和社会科学来代表一个不明的随机变量 可以判断各种情
  • jenkins api获取构建日志_Jenkins master位于k8s集群外,实现jenkins slave的动态构建

    Jenkins基于 kubernetes plugin 与k8s集成 可以使Jenkins slave以pod的形式在k8s集群内部动态构建 运行 销毁等 通过 jenkinsci kubernetes plugin 了解到 Jenkins
  • arm-none-linux-gnueabi-gcc下载

    arm none linux gnueabi gcc是 Codesourcery 公司 目前已经被Mentor收购 基于GCC推出的的ARM交叉编译工具 可用于交叉编译ARM系统中所有环节的代码 包括裸机程序 u boot Linux ke
  • 分词汇总

    SCWS Author Hightman 算法 基于词频词典的机械中文分词引擎 采用的是采集的词频词典 并辅以一定的专有名称 人名 地名 数字年代等规则识别来达到基本分词 准确率 经小范围测试大概准确率在 90 95 之间 已能基本满足一些
  • 移动Web开发入门(三) -- touch事件

    文章目录 touch事件 touch事件分类 代码演示 页面效果 点击红色区域未移动 点击红色区域 移动到红色区域抬起 点击红色区域 移动到红色区域外抬起 在红色区域外点击 移动到红色区域抬起 在红色区域外点击 穿过红色区域移动到红色区域外
  • 在Qt中,信号(signal)是怎样传递的

    在Qt中 信号 signal 是利用Qt的事件系统实现的 当信号被发射时 Qt会将其转换为一个事件 并将其插入到应用程序的事件队列中 每个QObject对象都有一个事件接收函数 即QObject event 函数 用于接收和处理事件 当一个
  • 如何使用宝塔面板搭建网站(搭建宝塔页面)

    书接上回 咱们已经搭建好咱们的Linux服务器 接下来改是搭建宝塔页面的教程了 这里我们需要一个域名 自行去各家云服务器购买域名 例如 腾讯云 阿里云 华为云等等 购买一个域名之后我们就可以开始搭建了 首先 启动你的Linux服务器 在此页
  • 4、Nginx 配置实例-反向代理

    文章目录 4 nginx 配置实例 反向代理 4 1 反向代理实例一 4 1 1 实验代码 4 3 反向代理实例二 4 3 1 实验代码 尚硅谷 尚硅谷Nginx教程由浅入深 志不强者智不达 言不信者行不果 4 nginx 配置实例 反向代

随机推荐

  • 0401自学web后端之——Flask配置文件

    输出默认config from flask import Flask current app app Flask name with app app context print dict current app config ENV pro
  • 【转】BAT机器学习面试1000题系列(第288~305题)

    288 LSTM神经网络输入输出究竟是怎样的 YJango 本题解析来源 https www zhihu com question 419497412017年1月4日文章Recurrent Layers 介绍 第一要明确的是神经网络所处理的
  • 信息管理毕业设计选题推荐

    文章目录 0 前言 1 java web 管理系统 毕设选题 2 java web 平台 业务系统 毕设选题 3 游戏设计 动画设计类 毕设选题 适合数媒的同学 4 算法开发 5 数据挖掘 毕设选题 6 大数据处理 云计算 区块链 毕设选题
  • 爬虫之代理的问题解决

    爬虫之代理 昨天学习小甲鱼的代理 但是弄了一晚上也没成功 一会是什么不积极相应 一会又是什么远程主机拒绝访问 http 45 32 164 128 ip php是个能返回当前访问的IP的网址 123 163 27 115 9999 是我在h
  • 视觉SLAM技术及其应用(章国锋--复杂环境下的鲁棒SfM与SLAM)

    SLAM 同时定位与地图构建 机器人和计算机视觉领域的基本问题 在未知环境中定位自身方位并同时构建环境三维地图 应用广泛 增强现实 虚拟现实 机器人 无人驾驶 SLAM常用的传感器 红外传感器 较近距离感应 常用与扫地机器人 激光雷达 单线
  • Myeclipse Bule Edition 添加SVN的方法

    今天 因项目需要在Myeclipse中添加svn 添加svn的方法可能有很多种 比较简单的自然是自动安装 这里离介绍一下手动的安装方法 1 需要下载一个subeclipse site的压缩包 网上有得下 subeclipse site 1
  • nginx check健康检查

    nginx利用第三方模块nginx upstream check module来检查后端服务器的健康情况 大家都知道 前段nginx做反代 如果后端服务器宕掉的话 nginx是不能把这台realserver提出upstream的 所以还会有
  • 高性能 Jsonpath 框架,Snack3 3.2.29 发布

    Snack3 一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明 及 Xml dom 一切都是 Node 的设计 其下一切数据都以ONode表示 ONode也即 One node 之意 代表任何类型
  • VUE项目性能优化,v-if,v-for,props,computed,watch......

    VUE项目性能优化 v if v for props computed watch 下个星期就要用vue开发了 就未雨绸缪的搜集了一些干货 整理出来 1 解决v for和v if优先级问题 以及通过计算属性来做数据筛选
  • Dynamics 365 DevOps CI/CD之WebResource

    对于D365自身的发布 简单点来说就是Solution的发布 复杂一些会涉及周边集成接口等一系列的发布 如果是单纯的Solution的发布的Azure DevOps商店里有很多工具 比如Power DevOps Tools 这个我之前也有博
  • Qt之QTableView显示鼠标悬浮下的项的信息

    业务上遇到一些需求 某个需求是当鼠标移动到QTableView的item上时 显示该item的某些信息 首先想到的思路就是鼠标悬浮事件 即安装QTableView的事件过滤器 然后在eventFilter进行判断即可 实现很简单 主要在针对
  • 段式存储管理、段页式存储管理

    分页与分段的区别 1 页是信息的物理单位 是系统管理的需要而不是用户的需要 而段是信息的逻辑单位 分段是为了更好地满足用户的需要 2 页的大小固定且由系统决定 一个系统只能有一种大小的页面 而段的长度不固定 由用户所编写的程序决定 3 分页
  • WinEdt 31天试用期到期解决方案

    WinEdt 在试用期过后 会频繁出现 WinEdt s trial period of 31 days has elapsed 的提示窗口 解决方案 修改脚本Exit edt 从Options Options Interface Adva
  • 多个DLL之间的Static变量以及模板实例化

    结论如下 1 DLL之间调用类public静态成员变量 不能使用A m static形式调用 其中A为类名 m static为A中的static成员变量 若使用 编译出现链接错误 必须使用函数调用方式 为m static增加set get函
  • python得到列表list的交集与差集

    python 神勇 得到两个列表的差集和交集 根本不用循环 一句话就可以搞定 交集 b1 1 2 3 b2 2 3 4 b3 val for val in b1 if val in b2 print b3 差集 b1 1 2 3 b2 2
  • linux gtk主题安装教程,如何获取、安装和制作 GTK 主题

    多数桌面版 Linux 都支持主题 GUI LCTT 译注 图形用户界面 独有的外观或者 风格 叫做主题 用户可以改变主题让桌面看起来与众不同 通常 用户也会更改图标 然而 主题和图标包是两个独立的实体 很多人想制作他们自己的主题 因此这是
  • Delphi Idhttp的post方法

    POST var Sendmessage TStringList 发送内容 Receivemessage TStringStream 返回内容 begin Sendmessage TStringList Create Receivemess
  • 三目运算符“?:”省略中间操作数

    在使用三目运算符的时候 我们经常见到的是 x x y 就是if else的简写 如果x为真 就返回x 如果x为假 就返回y 这是最简单最基本的用法 但是有时候会看到这种用法 x y 与 之间没有任何操作数 这是什么用法呢 在通过几个实例的实
  • 解决No converter for [class java.util.ArrayList] with preset Content-Type ‘null‘问题

    一 出现问题 二 解决方法 1 检查Maven依赖是否成功导入 记得clear后刷新
  • FileStream读写文件

    FileStream类 操作字节的 可以操作任何的文件 StreamReader类和StreamWriter类 操作字符的 只能操作文本文件 1 FileStream类 FileStream类 命名空间 System IO 1 构造函数 F