C#中的文件流总结

来源:互联网 发布:搜达数据 编辑:程序博客网 时间:2024/05/17 23:55

对与流类的相关操作,需要对比分清各种操作之间的相互关系。

即File类,FileInfo,FileStream,StreamWriter,StreamBuffered等各类之间的关系。

File类属于静态类,仅是打开,复制,移动或删除文件,且在未实例化前即可进行相关操作。

FileInfo类则需要实例化,在多次操作时有优点。创建方式:FileInfo  aFile=new FileInfo(@"~\data.txt");

相同点:FileInfo aFile=new FileInfo("data.txt"); if (aFile.Exists) Console.WriteLine("aFile Exists");

              if (File.Exists("data.txt") Console.WriteLine("File Exists");

FileStream类则是进行字节读取的流对象。创建方式:1>FileStream aFile=new FileStream(filename,FileMode.Member, FileAccess.Member);

相同点:打开只读(写)文件     FileStream aFile=File.OpenRead("data.txt");

                                                    FileInfo aFileInfo=new FileInfo("data.txt");   FileStream aFile=aFileInfo.OpenRead();

StreamWriter运行进行字符的操作。创建方式:1>StreamWriter sw=new StreamWriter("data.txt",true);

                                                                            2>FileStream aFile=new FileStream("data.txt",FileMode.CreateNew); StreamWriter sw = new StreamWriter(aFile);

字节转换为字符:Decoder d=Encoding.UTF8.GetDecoder(); d.GetChars(byData,0,byData.Length,charData,0);

字符转换为字节:Encoder d=Encoding.UTF8.GetEncoder(); d.GetBytes(charData,0,charData.Length,byData,0,true);                                                                                





文件读写

C#和java对于文件的操作的思路有点相似,都是采用管道技术和流操作—Stream来实现相应的功能.,开始操作文件的时候用到文件专用流:System.IO命名空间下的Filestream.,其构造函数有很多,现在先介绍一个很常用的方法:

FileStream 构造函数 (String, FileMode);

FileMode有:open,create,openOrcreate,createnew.append, Truncate等几种模式.

下面先看一个例子:

FileInfo mynewfile = new FileInfo("C:\\myfile.txt");//

FileStream sf = new FileStream(mynewfile.ToString(), FileMode.Create);//构造函数,以创建模式打开目标文件,如果不存在就创建相应的文件.

byte[] dataArray = new byte[100000];//字节

new Random().NextBytes(dataArray);//创建随机字节

for (int i = 0; i < dataArray.Length; i++)

{

sf.WriteByte(dataArray[i]);//将字节写入文件理.

}

其他构造方法有:

 

我在这里就不多介绍了,大家可以参考Msdn的文件.关于文件的读写还有个更好的StreamWriter/和StreamReader.下一节将继续介绍.

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

FielStream类维护内部文件指针,该指针指向文件中进行下一次读写操作的位置。

FileStream只能处理原始字节(raw byte),处理原始字节的功能使用FileStream类可以用于处理任何数据文件

 


一. FileStream详解

1. (FileStream fs1 = File.Open("c:\\test.txt", FileMode.Open));

FileMode.Open 直接用FileStream类打开文件c:\\test.txt",

2. (FileStream fs2 = File.Open("c:\\test.txt", FileMode.Append, FileAccess.Write));

FileMode.Append,以追加的方式打开文件"c:\\test.txt",将某些内容写到"c:\\test.txt"里.

3.(FileStream fs3 =File.Open("c:\\test.txt", FileMode.Truncate, FileAccess.ReadWrite, FileShare.Read)).

FileMode.Truncate的意思是将文件打开清空里面的内容后再对文件进行操作..

4. FileStream MyFileStream1 = new FileStream(@"c:\Testing.txt", FileMode.Create);

这个方法的意思是创建一个可以读写的文件,并且可以允许其他人读取文件的内容.

二. C#基于流的输入输出.

C#基于流的输入输出.:Stream-通过C# I/O 系统与物理设备连接起来,也就是平时读写的硬盘等物理存贮设备.流/Stream的方法和属性有:

Method/ Properties 描述
void Close() 关闭流
void Flush() 清理流中的内容
int ReadByte() 返回一个整数表示输入的字节数,如果没有数据返回-1
int Read(byte[ ] buf,int offset, int numBytes) 将numBytes个字节读入到byte[ ]的以offset为,起始位置,返回读入成功的字节数
 
Long Seek(long offset,SeekOrigin origin) 将当前位置定位到以origin为初始位置以后的offset处.
void WriteByte(byte b) 将单个字节写入到一个输出流.
void Write(byte[ ] buf,int offset, int numBytes) 写入byte[ ] buf中从offset开始的numBytes个字节.
bool CanRead 是否可读
bool CanSeek 是否支持寻址
bool CanWrite 是否可以写入数据
long Length 流的长度
long Position 流的当前位置.

三. 流的继承结构

Stream是一个很大类的,在读写文件的时候,可以通过不同的流进行专业的数据读写.

 

The FileMode and FileAccess的几条规则:

Value 意义
FileMode.Create 创建文件,之前存在同名的文件将被毁掉
FileMode.CreateNew 创建新文件,这个文件之前不存在
FileMode.Open 打开已经存在的文件
FileMode.OpenOrCreate 打开文件如果存在,否则创建新文件
FileMode.Truncate 打开以存在的文件,将它的内容清除掉
FileMode.Append 以追加的形式将数据写入到文件的最后

如果在打开文件的时候想限制文件访问权限,那么可以做如下的构造方法:

FileStream(string filename, FileMode mode, FileAccess access);

     文件名       文件模式       操作模式

Access可以是以下当中的一个值:

FileAccess.Read/  FileAccess.Write/  FileAccess.ReadWrite;

FileStreamfs=new FileStream(“c:\\tab.txt”,FileMode.OpenOrCreate,FileAccess.Read);


C#中的StreamReader/StreamWriter

 

在读写文件的过程中,Filestream只可以进行以字节为单位原始数据流进行读写操作,为此,C#中提供了功能更加强大的StreamReader/ StreamWriter来支持文件的读写. StreamReader/ StreamWriter可以进行以字符为单位的数据读写操作..

一. 用StreamReader的构造函数

StreamReader有很多的构造函数:在这里只列出两个常用和比较常见的

StreamReader  sr=new StreamReader (Stream); Stream可以是Filestream;

StreamReader  sr=new StreamReader (String); String为指定的文件名初始化 StreamReader 类的新实例。

例如:

//demo1

FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite); StreamReader sr = new StreamReader(filest);

//demo2

StreamReader another = new StreamReader(@"c:\abc.txt");

两个StreamReader都指向同一个文件.

StreamReader读取文件中的数据的代码:

FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite);

StreamReader sr = new StreamReader(filest);

string strLine = sr.ReadLine();//读取文件中的一行

while(strLine!=null)//判断是否为空,表示到文件最后一行了

{

Console.WriteLine(strLine);

strLine = sr.ReadLine();

}

sr.Close();//关闭流

filest.Close();
 

程序运行结果和盘中abc.txt文件中的内容比较如下:

   

二. StreamWriter

StreamWriter 专门用于的向文件中写数据的,它和StreamReader类似,只是一个负责向文件中写数据,一个负责向文件中读数据而已.

StreamWriter 构造函数也有很多.在这里只举例两个构造函数.

StreamWriter  sr=new StreamWriter (Stream); Stream可以是Filestream;

StreamWriter  sr=new StreamWriter (String); String为指定的文件名初始化StreamWriter 类的新实例。

例如:

//demo1

FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter (filest);

//demo2

StreamWriter another = new StreamWriter (@"c:\abc.txt");下面的例子可以让大家掌握写文件的方法.

FileStream filewriter = new FileStream(@"C:\abc.txt", FileMode.Append, FileAccess.Write);

以追加的方式打开文件,并进行写入操作.

StreamWriter sw = new StreamWriter(filewriter); 构造函数;

for (char mychar = 'a'; mychar <= 'z'; mychar++)

{

sw.Write(mychar);//将从a—z26个小写字母写入文件中.

}

sw.Close();filewriter.Close();

//demo

FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite);

StreamReader sr = new StreamReader(filest);

string strLine = sr.ReadLine();

while(strLine!=null)

{

Console.WriteLine(strLine);

strLine = sr.ReadLine();

}

sr.Close();

filest.Close();


这篇主要介绍几个操作文件流的类,读写类StreamReader,StreamWriter和File类以及Directory类的操作

FileStream类的控制

(1) Flush();  清除此流的缓冲区,是为了保护硬盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25static void Main(string[] args)
{
            using (FileStream filewrite = new FileStream("file.txt", FileMode.Create, FileAccess.Write))
            {
                filewrite.WriteByte(101);
                filewrite.WriteByte(101);
                //清除此流的缓冲区
                filewrite.Flush();
                filewrite.WriteByte(101);
                filewrite.WriteByte(101);
                //每次写一个直接就会频繁的操作硬盘,
            }
}

(2)Seek(偏移,位置枚举)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19static void Main(string[] args)
{
            using (FileStream fileRead = new FileStream("file.txt", FileMode.Open, FileAccess.Read))
            {
                fileRead.Position = 4;
                fileRead.Seek(3, SeekOrigin.Current);
                int n = fileRead.ReadByte();
                Console.WriteLine((char)n);
            }

其它流

(1)MemoryStream 内存流

            NetworkStream ns = new NetworkStream();

(2)NetworkStream 网络流

            MemoryStream ms = new MemoryStream();

读写流

(1) StreamReader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35//读取文件流
        static void Main(string[] args)
        {
            using(FileStream fileRead=new FileStream("成功.txt",FileMode.Open,FileAccess.Read))
            {
                using (StreamReader sr = new StreamReader(fileRead,Encoding.Default))
                {
                    //第一种读法
                    //string str = sr.ReadLine();
                    //while ((str = sr.ReadLine()) != null)
                    //{
                    //    Console.WriteLine(str);
                    //}
                    //第二种读法
                    Console.WriteLine(sr.ReadToEnd());
                }
            }
        }

(2)StreamWriter

            static void Main(string[] args)

        {

            using (StreamWriter sw = new StreamWriter("成功.txt"))

            {

                sw.WriteLine();

            }

        }


0 0
原创粉丝点击