引言

在System.IO 命名空间下提供了一系列的类,我们可以通过相应的类进行文件、目录、数据流的操作。

1、File类:提供用于创建、复制、删除、移动和打开文件的静态方法。File类

2、FileInfo类:提供创建、复制、删除、移动和打开文件的属性和实例方法。FileInfo类

3、FileStream类:主要用于读取磁盘上的文件或者向磁盘文件写入信息。有时,我们需要将程序中的一些数据存储到磁盘上或是读取配置文件中某些内容,在这里我们就会用该类。

4、MemoryStream类: 主要用于操作内存中的数据。比如说网络中传输数据时可以用流的形式,当我们收到这些流数据时就可以声明MemoryStream类来存储并且处理它们。

5、BufferedStream类:主要也是用来处理流数据的,但是该类主要的功能是用来封装其他流类。为什么要封装其他流类,这么做的意义是什么?按照微软的话说主要是减少某些流直接操作存储设备的时间。对于一些流来说直接向磁盘中存储数据这种做法的效率并不高,用BufferedStream包装过的流,先在内存中进行统一的处理再向磁盘中写入数据,也会提高写入的效率。

6、 NetworkStream类:主要是专门用来处理服务器与客户端通信的流。它在网络编程中经常使用,主要是用来处理类似Socket、TcpClient和TcpListener这些类中得到的流。

7、StreamReader/StreamWriter类:主要用来处理流数据。它们分别提供了高效的流读取/写入功能。

8、TextReader/TextWriter类:主要用来处理流数据。它们分别提供了高效的文本流读取/写入功能。

Stream类,TextReader类,TextWriter类,BinaryReader类,BinaryWriter类都继承了IDisposable接口,所以使用后必须关闭流。把流中数据加载到内存时要考虑内存溢出等问题Stream类,TextReader类,TextWriter类都为抽象类。

File类

提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。重要点在于协助创建FileStream对象,从而进行一下操作,所以File类的应用重点在创建、删除、打开等操作。

重点方法:

File.Exists 确定文件是否存在,经常用的。

File.Create 指定路径创建文件,这方法应用很少。

File.move 将指定文件移到新位置,并提供指定新文件名的选项。

File.OpenRead 打开现有文件以进行读取。返回FileStream 比较常用,可以应用比较广泛的流。

File.OpenWrite 打开现有文件以进行写入.

File.OpenText 打开现有 UTF-8 编码文本文件以进行读取。这个在写日志时,应用比较广泛。

File.AppendText 创建一个 StreamWriter,它将 UTF-8 编码文本追加到现有文件。这个也比较常用,以供日志随时读取和写入。

 //1.判断一个文件是否存在

 if (!File.Exists(@"c:\hello.txt"))
{
File.Create(@"c:\hello.txt");
}
////2.拷贝一个文件
File.Copy(@"c:\hello.txt", @"d:\hello.txt");
//File.Move(); 移动,剪切文件
//4.删除一个文件
//文件的删除,即便文件不存在也不会报异常
File.Delete(@"c:\abc.txt");
//5.读取一个文件,写入
File.WriteAllText(@"c:\xxx.txt", "你好China !");

FileStream类

使用 FileStream 类对文件系统上的文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream 对输入输出进行缓冲,从而提高性能。

请确保对所有 FileStream 对象调用 Dispose 方法,特别是在磁盘空间有限的环境中。如果没有可用的磁盘空间并且在终止 FileStream 之前没有调用 Dispose 方法,则执行 IO 操作会引发异常。

file 类是实用工具类,所带静态方法主要用于根据文件路径和标准输入、标准输出以及标准错误设备创建 FileStream 对象。MemoryStream 类通过字节数组创建流,而且功能与 FileStream 类似。

  • FileStream文件流的使用方式。

    一、创建一个文件流

    二、读文件或者写文件

    三、关闭文件流

    四、释放相关资源
 ////1.创建一个    中国.txt
string txt = "中国是四大文明古国之一";
//一、创建一个文件流
FileStream fs = new FileStream(@"c:\中国.txt", FileMode.Create, FileAccess.Write);
byte[] buffer = Encoding.UTF8.GetBytes(txt);
//二、读文件或者写文件
//参数1:表示要把哪个byte[]数组中的内容写入到文件
//参数2:表示要从该byte[]数组的第几个下标开始写入,一般都是0
//参数3:要写入的字节的个数。
fs.Write(buffer, 0, buffer.Length);
//三、关闭文件流
//清空缓冲区
fs.Flush();
fs.Close();
//四、释放相关资源
fs.Dispose();

针对释放资源,一般使用Using

using (FileStream fs = new FileStream(@"c:\中国.txt", FileMode.Create, FileAccess.Write))
{
byte[] buffer = Encoding.UTF8.GetBytes(txt);
//二、读文件或者写文件fs.Write(buffer, 0, buffer.Length);
}

这样就ok了。

利用FIleStream进行文件复制操作

 //1.创建一个读取源文件的文件流
using (FileStream fsRead = new FileStream(source, FileMode.Open, FileAccess.Read))
{
//2.创建一个写入新文件的文件流
using (FileStream fsWrite = new FileStream(target, FileMode.Create, FileAccess.Write))
{
//创建缓冲区
byte[] buffer = new byte[1024 * 1024 * 5];
//3.通过fsRead读取源文件,然后再通过fsWrite写入新文件
//通过文件流读取
//返回值:表示本次实际读取到的字节个数。
int byteCount = fsRead.Read(buffer, 0, buffer.Length);
while (byteCount > 0)
{
//把刚刚读取到的内容写入到新文件流中
fsWrite.Write(buffer, 0,byteCount);
//需要循环执行读写操作
//把上次读取到内容写入完毕后,继续再读取,这里会自动定位。
byteCount = fsRead.Read(buffer, 0, buffer.Length);
//fsRead.Position
//fsWrite.Position
Console.Write(". ");
}
}
}

用filestream从文件中读取文件。是通过指定文件大小读取文件。如果在操作过程中,读取一部分显示一部分时,加入获取的byte数组的大小有错误,可能导致文件显示不正确。所以在文件读取显示操作时不能用filestream。专门针对文件操作的文件流。

StreamReader/StreamWriter类

StreamReader/StreamWriter主要用来处理流数据。它们分别提供了高效的流读取/写入功能。

StreamReader/Writer读写
StreamReader reader = new StreamReader("filePath");//初始化读取
StreamWriter writer = new StreamWriter("filePath");//初始化写入
//或者,如果没有就会创建文件,不会报错
StreamWriter writer = File.AppendText("Filepath"); string readStr=reader.ReadLine();//从流中读取一行
//2.循环读取每一行数据。
string line = null;
//int count = 0;
while ((line = reader.ReadLine()) != null)
{
//count++;
Console.WriteLine(line);
}
string readAff = reader.ReadToEnd();//从流中读取全部 writer.Write("Hi 你好");//写入内容
writer.WriteLine("Hi 你好");//写入一行 reader.Close();//关闭流
writer.Close();

其他流

MemoryStream类主要用于操作内存中的数据。比如说网络中传输数据时可以用流的形式,当我们收到这些流数据时就可以声明MemoryStream类来存储并且处理它们。读取图片数据可以用


string str = "Hi!你好!";
byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转化为字节数组
MemoryStream memory = new MemoryStream(array);//初始化MemoryStream类
byte[] arrayNew = memory.ToArray();//将内存中的数据转换为字节数组
string strNew = Encoding.UTF8.GetString(arrayNew);//将字节数组转换为字符串

BufferedStream类主要也是用来处理流数据的,但是该类主要的功能是用来封装其他流类。为什么要封装其他流类,这么做的意义是什么?按照微软的话说主要是减少某些流直接操作存储设备的时间。对于一些流来说直接向磁盘中存储数据这种做法的效率并不高,用BufferedStream包装过的流,先在内存中进行统一的处理再向磁盘中写入数据,也会提高写入的效率。

NetWorkStream类是专门用来处理服务器与客户端通信的流。它在网络编程中经常使用,主要是用来处理类似Socket、TcpClient和TcpListener这些类中得到的流。

//服务器
TcpListener lis=new TcpListener(5000); //服务器监听
lis.Start();//启动
Socket sock=lis.AcceptSocket();//阻塞,直到有客户端连接 NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流
if (netStream.DataAvailable) //如果客户端发送了消息
{
byte[] data = new byte[1024]; //定义一个字节数组,用来存放接收的数据
int len = netStream.Read(data, 0, data.Length); //从位置开始,读取到字节数组末尾
string line = Encoding.Default.GetString(data, 0, len); //把收到的字节转换为字符串
}
//客户端
TcpClient client = new TcpClient();//客户端tcp对象
client.Connect("127.0.0.1", 5000);//连接服务器
NetworkStream myStream = client.GetStream();//得到网络流 byte[] data = Encoding.Default.GetBytes("Hi,你好"); //首先把输入的字符串消息转换为字节
myStream .Write(data, 0, data.Length); //向myStream 里写入数据
myStream .Flush(); //刷新流中的数据
myStream .Close();

c#基础语言编程-文件流操作的更多相关文章

  1. (C/C++学习)2.C语言中文件流操作基本函数总结

    函数所在头文件:stdio.h 说明:前半部分主要为对各个文件流操作函数的例举,后半部分着重于上机运行分析.文中部分引用自王桂林老师的C/C++课件. 1.FIELE *fopen(const cha ...

  2. ndk学习之c++语言基础复习----C++容器、类型转换、异常与文件流操作

    继续来复习C++,比较枯燥,但是这是扎实掌握NDK开发的必经之路,不容小觑. 容器: 容器,就是用来存放东西的盒子. 常用的数据结构包括:数组array, 链表list, 树tree, 栈stack, ...

  3. delphi 基础之三 文件流操作

    文件流操作 Delphi操作流文件:什么是流?流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具.在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的, ...

  4. C语言对文件的操作函数用法详解1

    在ANSIC中,对文件的操作分为两种方式,即: 流式文件操作 I/O文件操作 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下: typedef str ...

  5. C语言对文件的操作函数用法详解2

    fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const  ...

  6. C++学习7-面向对象编程基础(多态性与虚函数、 IO文件流操作)

    多态 多态性是指对不同类的对象发出相同的消息将返回不同的行为,消息主要是指类的成员函数的调用,不同的行为是指不同的实现: 函数重载 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函 ...

  7. C++文件编程(文件流操作)

    给出了比较常见的文件操作,包括二进制文件操作.代码如下: #include<iostream> #include<cstdio> #include<cstring> ...

  8. c语言中文件相关操作

    一 .首先介绍一下数据文件的类型: 1.二进制文件(映像文件):在内存中以二进制形式存取. 2.文本文件(ascii文件):以ascii码形式存取的文件. 通俗的讲,在Mac下,你把一个文件丢进记事本 ...

  9. C++中输入输出流及文件流操作笔记

    1.流的控制 iomanip          在使用格式化I/O时应包含此头文件.    stdiostream   用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序 2.类 ...

随机推荐

  1. 总结javascript继承的两种方式的N中写法

    最近翻看博客园,总结了一下javascript的继承方式:prototype和copy继承方式. 一.prototype方式 当一个函数被创建时,Function构造函数产生的函数会隐式的被赋予一个p ...

  2. 安装sql server 2008,提示要删除SQL Server 2005 Express 工具 怎么解决?

    x86 修改注册表:HKLM\Software\Microsoft\Microsoft SQL Server\90\Tools\ShellSEM,把 ShellSEM重命名即可. x64       ...

  3. 配置并学习微信JS-SDK(2)—扫一扫接口http://www.qq210.com/shoutu/android

    http://www.qq210.com/shoutu/android //c_开头的js变量是服务器传过来的 var c_access_token = "<?=$access_tok ...

  4. 将VIM配置成强大的IDE(二)

    将VIM配置成强大的IDE(二) 前面我们已经安装好了vundle这一款强大的插件管理工具. 下面,当然是配置我们需要的插件了. 在VIM下面通过命令 help vundle 我们可以知道,VUNDL ...

  5. PYTHON开发--面向对象基础入门

    面向对象 一:面向对象初级 1.思考:首先在python中,以前我们以前用到的几乎都是函数式编程,但是有时候函数式编程其中代码重复利用率太高,我们往往会把这些重复代码写进一个函数日后去调用,所以呢,今 ...

  6. 把一个string串的所有小写字母转成大写字母的例子来看看看全局函数的使用

    今天写了一个小例子,把字符串里面的所有小写字母全部转换成大写字母http://blog.csdn.net/yasaken/article/details/7303903 1 #include &quo ...

  7. 2016021904 - 如何使用Memory Analyzer

    如何使用Memory Analyzer呢? 0.有内存溢出的代码code.<深入理解java虚拟机>中代码 package neutron.oom.heap; import java.ut ...

  8. HDFS 搭建记录

    1. 三台服务: 172.17.0.62(namenode) 172.17.0.68(datanode) 172.17.0.76(datanode) /etc/hosts包含的内容: 三台都包含的域名 ...

  9. [原创]dm642_HPI调通并boot成功

    一直在折腾前段时间画好的dm642+lpc4357板子,说明下这个板子的结构: 主芯片为DM642,这个片子很老了,但因为对这个片子熟悉,别折腾 没有给DM642加FLASH,配了一片LPC4357, ...

  10. C#匿名类型(Anonymous Type)学习日记

    当我们不要定义复杂的方法,事件,构造函数这样复杂的类的时候,可以动态的生成一个自定义的数据类型 --> 匿名类型. 1.定义匿名类型 定义一个匿名类型时,需要用到 var 关键字和对象初始化语法 ...