当前位置:首页 > C#学习 > 正文内容

StreamReader/StreamWriter与FileStream的区别

小道6年前 (2018-08-30)C#学习6313

一个很大的区别就是:StreamReader/StreamWriter操作的是字符数据(char),而FileStream操作的是字节数据(byte),FileStream与StreamXXXX类的默认编码都是UTF8,而一个中文字符占2个字符,所以StreamXXXX类常用于文本的打开与保存,而FileStream则用于数据的传输。

FileStream是不能指定编码(因为它看到的只是文件的二进制形式,当然无所谓编码),所以如果有中文的文本的话需要转码。

FileStream是一个较底层的类,只能简单地读文件到而缓冲区,而StreamXXXX类封装了一些高级的方法,如ReadLine() (按行读取)FileStream可以指定FileMode、FileAccess、FileShare、FileOptions等各种文件访问控制权限、共享权限等,大大扩展了文件读写的灵活性,而且FileStream还提供了BeginRead/BeginWrite(异步读写)的操作方法,用得好的话可以提高10倍操作速度哦!


以上节选自《C#学习笔记


FileStream对象表示在磁盘或网络路径上指向文件的流。

这个类提供了在文件中读写字节的方法,但经常使用StreamReader或 StreamWriter执行这些功能。

这是因为FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据。

这是这两种类的一个重要区别,如果你是准备读取byte数据的话,用StreamReader读取然后用 System.Text.Encoding.Default.GetBytes转化的话,如下,则可能出现数据丢失的情况,如byte数据的个数不对等。因此操作byte数据时要用FileStream。

string textContent = fileStream.ReadToEnd();byte[] bytes = System.Text.Encoding.Default.GetBytes(textContent);

字符数据易于使用, 但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行.


以上节选自《新浪博客


使用窗体打开读取文件,保存文件:

image.png

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OpenFileDialog打开文件对话框
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string 路径 = null;//全局变量
        private void 打开()//打开方法
        {
            OpenFileDialog ofd = new OpenFileDialog();// 创建一个OpenFileDialog控件
            ofd.InitialDirectory = @"F:\"; //InitialDirectory 设置默认打开地址。
            ofd.Filter = "文本文档(*.txt)|*txt|所有文件(*.*)|*.*";//Filter 设置可以打开文件的格式。
            ofd.Title = "请选择你要打开的文件";//对话框的标题。
            ofd.Multiselect = false;//Multiselect 是否可以多选文件。
            ofd.RestoreDirectory = true;//RestoreDirectory 设置对话框是否记忆最后一次打开的路径。
            ofd.FilterIndex = 1;//FilterIndex 设置显示打开文档默认的格式。
            if (ofd.ShowDialog() == DialogResult.OK)//判断是否打开文件。
            {
                string 获取路径 = ofd.FileName;//获取用户选择的完整路径+文件名
                路径 = 获取路径;//将路径赋值给全局变量
                string 获取文件名 = ofd.SafeFileName;//获取打开的文件名
                txtb文本框.AppendText("打开文件的路径和文件名:【" + 获取路径 + "】\r\n");
                txtb文本框.AppendText("打开的文件名:【" + 获取文件名 + "】\r\n");
                using (FileStream fs = File.OpenRead(获取路径)) //打开读取选中的文件(字节数据(byte))
                {
                    using (StreamReader sr = new StreamReader(fs,Encoding.Default))//读取(字符数据(char))
                    {
                        string line = null;//定义字符串
                        while ((line = sr.ReadLine()) != null)//ReadLine()获取行(将一行的数据保存为一个字符串), 赋值给line,在判断是否不等于null。如果为null 则是为空没数据。
                        {
                            txtb文本框.AppendText(line + "\r\n");//输出line  + 换行。
                        }
                    }
                }
            }
        }
        private void 保存()//保存方法
        {
            if (路径 != null)//判断路径是否为null
            {
                using (StreamWriter sw = new StreamWriter(路径, false, Encoding.Default))//路径,false是以全覆盖的方式保存。 true是以追加的方式保存。
                {
                    sw.WriteLine(txtb文本框.Text);//写入
                    MessageBox.Show("保存成功。");//提示
                }
            }
            else
            {
                MessageBox.Show("请先打开一个文件。");//提示
            }
        }

        private void bt打开_Click(object sender, EventArgs e)
        {
            打开();//调用方法
        }
        private void bt保存_Click(object sender, EventArgs e)
        {
            保存();//调用方法
        }
    }
}

输出结果:

image.pngimage.pngimage.png

扫描二维码推送至手机访问。

版权声明:本文由小道发布,如需转载请注明出处。

本文链接:https://daobk.com/post/86.html

分享给朋友:

“StreamReader/StreamWriter与FileStream的区别” 的相关文章

if语句应用:提示用户输入密码,如果输入的是"888888",输出"密码正确",反之则输出"密码不正确"

if语句应用:提示用户输入密码,如果输入的是"888888",输出"密码正确",反之则输出"密码不正确"

if语句应用:提示用户输入密码,如果输入的是"888888",输出"密码正确",反之则输出"密码不正确"。提示用户输入密码,如果密码是“888888”则提示正确,否则提示错误。     &n...

类型转换Cast和Convert

类型转换Cast和Convert

把源类型赋值给目标类型,两个类型不一致的时候会发生类型转换。a=b,b是源,a是目标。隐式转换、显式转换。当目标类型一定能满足源类型转换过去后的要求的话就是隐式转换;如果当目标类型不一定能满足源类型转换过去后的要求的话就需要显式转换(程序员自己负责)。比如:把中国人转换为人是隐式转换,把人转换为中国...

函数重名:构成重载的条件:参数类型不同或者参数个数不同(不严谨),与返回值无关。

函数重名:构成重载的条件:参数类型不同或者参数个数不同(不严谨),与返回值无关。

构成重载的条件:参数类型不同或者参数个数不同(不严谨),与返回值无关。        static void Main(string[] args)//默认函数   &...

字符串函数详解

字符串函数详解

字符串替换:string Replace(string oldValue, string newValue)将字符串中的出现oldValue的地方替换为newValue。例子:名字替换。取子字符串:string Substring(int startIndex),取从位置startIndex开始一直...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。