FileStream,StreamReader,StreamWiter的用法

https://blog.csdn.net/Good_StudyDaydayUp/article/details/82976951

https://blog.csdn.net/linxinfa/article/details/95215416

https://blog.csdn.net/qq_42778001/article/details/109166550

1、先看下File和FileStream的区别:

File在读取文件时,是一下子全部读取出来;

FileStream在读取文件时,是一点一点的读取的,对于内存来说,压力更小一些;

2、FileStream与 StreamWriter 和StreamReader 区别

FileStream 对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法,操作byte数据时要用FileStream,符数据易于使用, 但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行。

(意味着所有的文件格式都可以操作,可操作大文件,小文件的操作一般使用File)。

StreamWriter 和StreamReader 可以直接操作字符和字符串,通常用来读取文件内容和向文件写入数据。
但经常使用 StreamReader 或 StreamWriter 执行这些功能。
这是因为 FileStream 类操作的是字节和字节数组,而 StreamReader 或 StreamWriter 操作的是字符数据

StreamReader 或 StreamWriter 通过使用特定编码在字符与字节之间进行转换,提供了高效的流读写功能,可以直接用字符串进行读写,而不用转换成字节数组。

默认情况下,StreamReader 和 StreamWriter 类都使用 UTF-8编码。UTF-8编码正确处理 Unicode 字符并确保操作系统的本地化版本之间保持一致。

3、详解

1、创建FileStream

// 创建
// 参数一:指定文件路径
// 参数二:FileMode 是一个枚举类,指定操作系统打开文件的方式(针对文件做的操作)
// 参数三:FileAccess 是一个枚举类,指定此次操作是 读 还是 写 还是 读写(针对文件的数据做的操作)
FileStream fs = new FileStream(@"C:\Users\Administrator\Desktop\1.txt",
FileMode.OpenOrCreate, FileAccess.Read);

2、读

// 读取
// 参数一:字节数组,它会把读取到的数据放到这个字节数组中,我们可以使用这种方式可以限定它每次可以读取多少
// 参数二:表示从哪个地方往这个字节数组写入数据,通常从0开始
// 参数三:最多读取的字节数
// 返回值: 是一个int类型,如:我们每次读取5M,但是文件实际大小为2M,此时返回值就是本次实际读取
// 到的2M的大小
//不管多大小,每次只读取5M,
byte[] buffer = new byte[1024 * 1024 * 5];
int r = fs.Read(buffer, 0, buffer.Length);

3、转字符串、关闭流、释放资源

// 转成字符串
// 因为读取完是一个字节形式的,所以需要把字节转化为字符串格式的
// 参数二:从字节数组中哪个位置开始解码
// 参数三:解码多少个,下边的r是上边读取出来的字节
string s = Encoding.UTF8.GetString(buffer, 0, r);


// 关闭流
fs.Close();

// 释放流所占用的资源(c#中有几个不会自动被GC垃圾回收器回收,所以需要手动释放)
fs.Dispose();

 

4、如果读取的文件内容几字节或几KB ,此时我们输出上边字符串s时,在命令行中会出现大量的空字符串,原因:上边我们写的每次读取5M大小,但是实际文件夹大小只有几kb,前边它会使用大量的空字符串来表示,解决此问题,可以在字节转字符串时,通过参数二和参数三来处理。

读取结果:

 

 

FileSteam 写入数据:

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

// 把创建FileStream写在using括号中,目的帮助我们释放流所占用的资源
using (FileStream fs = new FileStream(@"C:\Users\Administrator\Desktop\1.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
string str = "哈哈哈哈哈哈哈";
// 将字符串转字节数组
byte[] buffer = Encoding.UTF8.GetBytes(str);
fs.Write(buffer, 0, buffer.Length);
}
Console.ReadLine();


写入之前的文件内容:

 

 

 

写入之后的内容:

 

是按字节大小类写入文件的!!!


小例子:
1、多媒体文件的复制:

// 赋值一个多媒体文件
public static void GetCopyMadie(string source, string target)
{
using (FileStream fsRead = new FileStream(source, FileMode.OpenOrCreate, FileAccess.Read))
{
using(FileStream fsWrite = new FileStream(target, FileMode.OpenOrCreate, FileAccess.Write)){
// 每次读取的大小(5M)
byte[] buffer = new byte[1024 * 1024 * 5];
// 循环读取
while (true)
{
// 读取到的字节
int r = fsRead.Read(buffer, 0, buffer.Length);
if(r == 0)
{
break;
}
// 写入新文件,每次写入r大小的字节数
fsWrite.Write(buffer, 0, r);
}
}
}
}

 

StreamReader和StreamWriter
读:

操作字符的(只能操作文本文件)

1、所在的命名空间也是 using System.IO;

2、只能是单行读取文件内容,所以想读取全部文件内容需要循环读取。

string path = @"C:\Users\Administrator\Desktop\1.txt";
using (StreamReader fs = new StreamReader(path, Encoding.UTF8))
{
while (!fs.EndOfStream)
{
Console.WriteLine(fs.ReadLine());
}
}
下边用到的方法:

(1)fs.EndOfStream 判断是否读到了流结尾。 

(2)fs.ReadLine() 从当前流中读取一行字符,并将数据作为字符返回。 

写:

1、写入一个文本文件;

参数一:指定要写入的路径,存在则根据参数二来判断是覆盖内容 还是 插入内容

参数二:bool类型,true为插入内容,false为覆盖原来内容

参数三:编码格式

static void Main(string[] args)
{
string path = @"C:\Users\Administrator\Desktop\1.txt";
using (StreamWriter fs = new StreamWriter(path, true, Encoding.UTF8))
{
fs.WriteLine("写入一行数据");
}
Console.ReadLine();
}

 

 

posted @ 2022-09-29 17:54  yinghualeihenmei  阅读(177)  评论(0编辑  收藏  举报