文件处理

流是一个用于传输数据的对象。
字节流就是一堆字节,有很多方法对操作这些字节(类比河流,水分子)。
流具有方向性,单向处理。

FileStream

FileSteam对象表示在磁盘或网络路径上指向文件的流(就是一堆字节)。这个类提供了在文件中读写字节的方法。
1.构造方法
new FileStream(string path,FileMode mode,FileAccess access)
FileMode用于确定如何打开或创建文件,其枚举成员如下

成员文件存在文件不存在
Append在文件后边写东西,打开文件,流指向文件的末尾,只能与枚举FileAccess.Write结合使用创建新文件,只能与枚举FileAccess.Write结合使用
Create删除该文件,然后创建新文件创建新文件
Open打开现有文件,流指向文件开头创建新文件

FileAccess确定访问文件的方式,其枚举成员入下

成员说明
Read打开文件,用于只读
Write打开文件,用于只写
ReadWrite打开文件,用于读写

2.int FileStream.Read(byte[] array,int offset,int count)
从流中读取字符块并将该数据写入给定缓冲区中
第一个参数是传入的字节数组,用来接收FileStream对象中的数据。
第二个参数是字节数组中开始写入数据的位置,通常是0,表示从数组开端向文件总写入数据。
第三个参数指定从文件中读出多少字节。
从流读取count个字节,从buffer的offset位置开始存放,返回实际读取到的字节数。

using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
   byte[] bs = new byte[1024*1024];
   int count=fs.Read(bs, 0, bs.Length);
}

3.void FileStream.Write(byte[] array,int offset,int count)
array包含要写入该流的数据的缓冲区
offset,从此处开始将字节复制到该流
count,最多写入的字节数
首先创建一个字节数组。最简单的方法是先构建要写入文件的字符数组,然后将其转换为字节数组。
然后调用Write方法,将字节数组传送到文件中。
有1000瓶可乐,从a搬到b,我先把100瓶装到箱子里,然后再把箱子搬到b,重复这个过程,把可乐搬完。
a是电脑 ,箱子是缓存(就是那个字节数组), b是硬盘,同理把可乐换成字节。

using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
   string str = Console.ReadLine();
   byte[]bt=Encoding.Default.GetBytes(str);            
   fs.Write(bt, 0, bt.Length);
}

StreamReader和StreamWriter

StreamReader

1.构造方法
new StreamReader(string path,Encoding encoding)
用指定的字符编码,为指定的文件名创建StreamReader类的新实例。
StreamReader 的默认编码为 UTF-8,而不是当前系统的 ANSI 代码页。
2.string StreamReader.ReaderLine()
从当前流中读一行字符并将数据作为字符串返回

string path = @"G:\IT\C#\传智播客基础实训\20121108C#基础o\视频\1\2.txt";
using (StreamReader reader = new StreamReader(path,Encoding.Default))
{
     string str = null;
     while (!reader.EndOfStream)
     {
         str = reader.ReadLine();
         Console.WriteLine(str);
     }
}

StreamWriter

1.构造函数
new StreamWriter(string path,bool append,Encoding encoding )
用指定的编码和默认缓冲区大小,为指定的文件初始化 StreamWriter 类的一个新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,则此构造函数将创建一个新文件。
2.void TextWriter.WriteLine(string value)
将后跟行结束符的字符串写入文本字符串或流

static void Main(string[] args)
        {
            string path = @"G:\IT\C#\传智播客基础实训\20121108C#基础o\视频\1\2.txt";

            using (StreamWriter writer=new StreamWriter(path,true,Encoding.Default))
            {
                while (true)
                {
                    string input = Console.ReadLine();

                    if (input=="保存")
                    {
                        Console.WriteLine("保存成功");
                        break;
                    }

                    writer.WriteLine(input);
                }
            }

File

File是静态类
1.FileStream File.Create(string path)
在指定路径上创建文件,若文件存在则覆盖文件

string path = @"G:\IT\C#\传智播客基础实训\20121106C#基础\视\book.txt";
File.Create(path);

2.void File.Delete(string path)
删除指定路径下的文件,直接删除,回收站没有,如果没有这个文件不报异常
3.bool File.Exist(string path)
判断指定的文件是否存在,true则存在
4.void File.Move(string sourceFileName,string destFileName)
将指定文件移动到新位置,可以改名,如果那个路径有这个文件了会报异常

string path = @"G:\IT\C#\传智播客基础实训\20121106C#基础\视\book.txt";
 string path1 = @"G:\IT\C#\传智播客基础实训\20121106C#基础\book1.txt";
File.Move(path,path1);

5.1void File.Copy(string sourceFileName,string destFileName)
把文件复制到另一个路径下,可以改名,若已存在则报错
5.2void File.Copy(string sourceFileName,string destFileName,bool overwrite)
如果可以覆盖目标文件则为true
6.string [] File.ReadAllLines(string path,Encoding encoding)
打开一个文本文件,读取文件的所有行,然后关闭它

string path = @"G:\IT\C#\传智播客基础实训\20121106C#基础\视频\book.txt";
string [] str=File.ReadAllLines(path,Encoding.Default);//Default是获取ANSI编码
foreach (string item in str)
{
    Console.WriteLine(item);
}

7.string File.ReadAllText(string path,Encoding encoding)
打开一个文本文件,读取文件的所有行,然后关闭它
8.void File.WriteAllLines(string path,string [] contents)
创建一个新文件,在里边写入指定的字符串数组,然后关闭它 将数组按行写入文件
会覆盖旧内容
9.void File.WriteAllText(string path,string contents)
会覆盖旧内容 将字符串全部写入文件
10.void File.AppendAllText(string path,string contents)
打开一个文件,向其追加指定的字符串,然后关闭该文件,如果文件不存在,则创建一个

string path = @"G:\IT\C#\传智播客基础实训\20121106C#基础\视频\book.txt";
for (int i = 0; i < 12; i++)
{
   File.AppendAllText(path, "a");
}

11.void File.AppendAllLines(string path,string [] contents)

比较

FileStream在从硬盘中写东西的时候,先将东西写入缓冲区,然后调用Flush(或用using语句),把缓存中的数据写入硬盘。针对字节和字节数组进行操作,可以处理任何文件,但要有一定算法。当处理大型文件时,用FileStream,FileStream写入时可以规定一次写入多少,缓冲区满了后,一次性的写入硬盘。而File不管文件多大都会将文件一次性写入内存,然后再写入硬盘。

StreamWriter是对FileStream的进一步封装,是针对文本操作的。也是先将数据写入缓冲区,然后调用Flush把数据存入硬盘。可以实现多次写入数据后,在调用Flush写入硬盘,但File就不行,每调一次File就会自动写入硬盘一次。多次写入硬盘会对硬盘造成损耗,并且硬盘的读写速度很慢,会影响性能。

File是对StreamWriter进一步的封装,不需要自己调用Flush,使用了File后会自动将东西存入硬盘。

            //用File
            Stopwatch sp1 = new Stopwatch();
            sp1.Start();

            for (int i = 0; i < 1000; i++)
            {
                File.AppendAllText("1.txt", "1234567890\r\n");
            }

            sp1.Stop();
            Console.WriteLine(sp1.Elapsed);
            Console.ReadKey();

            //00:00:00.5720108



            //用StreamWriter
            Stopwatch sp2 = new Stopwatch();
            sp2.Start();
            using (StreamWriter w = new StreamWriter("2.txt", true, Encoding.UTF8))
            {
                for (int i = 0; i < 1000; i++)
                {
                    w.Write("1234567890\r\n");
                }
                sp2.Stop();
                Console.WriteLine(sp2.Elapsed);
            }
            Console.ReadKey();

            //00:00:00.0013123

Directory

1.DirectoryInfo Directory.CreateDirectory(string path)
在指定路径创建所有目录和子目录,如果已经有了,不报异常
2.1void Directory.Delete(string path)
从指定路径删除空文件夹,如果有东西会报错
2.2void Directory.Delete(string path,bool recursive)
如果为true则会删除文件夹和里边的东西,不会报错
3.bool Directory.Exists(string path)
判断给定路径下是否有这个文件夹
4.string [] Directory.GetDirectories(string path)
获取指定路径下所有文件夹的全路径
5.string [] Directory.GetFiles(string path)
获取文件夹下面所有文件的全路径

Path

1.string Path.GetFileName(string path)
获得指定路径字符串的文件名和扩展名
2.string Path.GetFileNameWithoutExtension(string path)
获得没有扩展名的文件名
3.string Path.GetExtension(string path)
获得扩展名
4.string Path.GetFullPath(string path)
获得全路径
5.string Path.GetDirectoryName(string path)
获得文件的目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值