System.IO命名空间包含允许在数据流和文件上进行同步,异步及写入的类型。文件是一些永久存储及具有特定顺序的字节组成的一个有序的,具有名称的集合。与文件有关的概念是目录路径和磁盘存储等。流提供了一种向后备存储写入字节和从后备存储读取字节的方式。后备存储包裹用文件存储或用内存(数组)存储,以及网络,CD等。

基本文件的I/O

  命名空间为System.I/O,程序集为mscorlib(在mscorlib.dll中)

  抽象基类Stream支持读取和写入字节。Stream集成了异步支持,其默认实现根据其相应的异步方法来定义同步读取和写入。

  所有表示流的类都是从Stream类继承的。Stream类及其派生类提供数据源和存储库的一般视图,使程序员不必了解操作系统和基础设备的具体细节。

  流涉及3个基本操作:从流读取,向流写入以及查找和修改流内当前位置。根据基础数据源或存储库,流可能只支持这些功能中的一部分。例如,NetworkStream不支持查找。Stream的CanRead,CanWrite和CanSeek属性及其派生类决定不同的流所支持的操作。

Stream类

  stream是所有流的抽象基类。流是字节序列的抽象概念,如文件,输入输出设备,内部进程通信管道或TCP/IP套接字。Stream类及其派生类提供这些不同类型的输入输出的一般视图,使程序员不必了解操作系统和基础设备的具体细节。

  如果用MemoryStream初始化流,流的后备存储是内存,容量随数据动态的增加。如果用FileStream初始化流,流的后备存储是文件,对流的操作视同对文件的操作。

  下面的例子使用Stream..WriteByte和Stream..Read写入和读取数据块

using System;

using System.IO;

public class Block

{

  public static void main()

  {

    Stream s=new MemoryStream();//产生一个流,它的后备存储是内存

    //将一个字节写入流内的当前位置,位置推进一个字节

    for(int i=0;i<100;i++)

    {

      s.WtriteByte((byte)i);

    }

    s.Positon=0;//流中位置设置为0

    byte[]betes=new byte[1000];

    //请求从流中读取的最大字节数等于流的长度

    int numBytesToRead=(int)s.Length;

    int numBytesRead=0;//偏移量设置为0

    while(numBytesToRead>0)

    {

      //s.Read从当前流读取字节序列,并将此流中的位置提升读取的字节数

      //返回值n是实际读取的字节数,如果已到达流的末尾则为零(0)

      int n=s.Read(   bytes,       //数组bytes接收从流中读取的字节

              numBytesRead,   //数组bytes的偏移量,从偏移量开始存储数据

              numBytesToRead);//请求读取的最大字节数

      if(n==0)

      {

        break;

      }

      numBytesRead+=n;

      numBytesToRead-=n;

    }

    s.Close();

    //现在请求读取的字节数numBytesToRead为0,偏移量numBytesRead应该为100

    Console.WriteLine("number of bytes read:"+numBytesRead);

  }

}

输出如下:

number of bytes read:100

File类
  file类提供用于创建,复制,删除,移动和打开文件的静态方法,并协助创建FileStream对象。也可将File类用于获取和设置文件属性或有关文件创建,访问及写入操作的DateTime信息。由于所有的File方法都是静态的,因此如果只想执行一个操作,则使用File方法的效果比使用相应的FileInfo实例方法可能更高

  下面演示File类的一些主要成员。代码中使用Using语句定义一个范围。将下面的代码放入Main方法。

string path=@"..\...\MyTest.txt";//MyTest.txt位于项目的文件夹

if(!File.Exits(path))

{

  //using语句用于定义一个范围,再次范围的末尾将释放对象sw

  //StreamWriter实现一个TextWriter,使其以特定的编码UTF-8向流中写入字符

  //File.CreateText创建或打开一个文件用于写入UTF-8编码的文本

  using(StreamWriter sw=FIle.CreateText(path))

  {

    sw.WriteLine("Hello");

    sw.WriteLine("AND");

    sw.WriteLine("Welcome");

  }

}

//使用StreamReader读取标准文本文件的各行信息

using (StreamReader sr=File.OpenText(path))

{

  string s="";

  //从当前的流中读出一行字符将数据作为字符串返回

  while((s=sr.ReadLine())!=null)

  {

    //显示Mytext.txt的内容“Hello/And/Welcome”到屏幕

    Console.WriteLine(s);

  }

}

try

{

  string path2=path+"temp";

  File.Delete(path2);//确保目标文件不存在

  File.Copy(path,path2);//复制文件

  Console.WriteLine("{0}was copied to {1}",path,path2);

  File.Delete(path2);

  Console.WriteLine("{0}was successfully deleted.",path2);

}

catch(Exception e)

{

  Console.WriteLine("The process failed:{0}",e.ToString());

}

运行结果为程序在本项目文件夹建立一个文本文件MyText.txt,屏幕显示为:

Hello/And/Welcome

..\..\myTest.txt was copied to..\..\myTest.txttemp

..\..\myTest.txt was successfully deleted

FileInfo类

  FileInfo类提供创建,复制,删除,移动和打开文件的实例方法,并且帮助创建FileStream对象,如果打算多次重用某个对象,可考虑使用FileInfo的实例方法,而不是File类的相对静态方法,以内并不总是需要安全检查

  下面的例子是使用FileInfo构造函数创建两个文件,并接着对其进行写入,读取,复制和删除操作

string path=@"..\..\MyText.txt"

FileInfo fil=new FileInfo(path);    //FileInfo提供的方法是非静态方法,必须实例化

if(!fil.Exists)

{

  using(StreamWriter sw=fil.CreaterText())

  {

    sw.WriteLine("Hello");

    sw.WriteLine("And");

    sw.WriteLine("Welcome");  

  }

}

using(StreamReader sr=fil.OpenText())

{

  string s="";

  while((s=sr.ReadLine())!=null)  

    Console.WriteLine(s);

}

try

{

  string path2=path+"temp";

  FileInfo fi2=new FileInfo(path2);

  fi2.Delete();    //确保目标文件不存在

  fi1.CopyTo(path2);  //复制文件

  Console.WriteLine("{0}was copied to {1}",path,path2);

  fi2.Delete();

  Console.WriteLine("{0}was successfully deleted",path2);

}

catch(Exception e)

{

  Console.WriteLine("The process failed:{0}",e.Tostring());

}

运行结果为

Hello/And/Welcome

..\..\myTest.txt was copied to..\..\myTest.txttemp

..\..\myTest.txt was successfully deleted

下面的一个例子是显示FileInfo的一些主要成员

//创建磁盘上给你唯一命名的零字节的临时文件并返回该文件的完整路径

//此方法创建带.TMP文件拓展名的临时文件

string path=Path.GetTempFileName();

//初始化FileInfo类的新实例,它作为文件路径的包装

FileInfo fil=new FileInfo(path);

if(!fil.Exists)

{

  //fil.CreateText创建吸入新文本文件的StreamWriter

  //默认情况下,将向所有用户授予对于新文件的完全读写访问权限

  using(StreamWriter sw=fil.CreateText())

  {

    sw.WriteLine("Hello");

    sw.WriteLine("And");

    sw.WriteLine("Welcome");

  }

}

using(StreamReader sr=fil.OpenText())//打开文件读取

{

  string s="";

  while((s=sr.ReadLine())!=null)

    Console.WriteLine(s);

}

try

{

  string path2=Path.GetTempFileName();

  FileInfo fi2=new FileInfo(path2);

  fi2.Delete();

  fi1.CopyTo(path2);

  Console.WriteLine("{0}was copied to{1}",path,path2);

  fi2.Delete();

  Console.WriteLine("{0}was successfully deleted.",path2)  

}

catch(Exception e)

{

  Console.WriteLine("The process failed:{0}",e.ToString());

}

运行结果如下:

C:\Documents and Settings\Administrator\Local Settings\temp\Temp10.tmp was copied to

C:\Documents and Settings\Administrator\Local Settings\temp\Temp11.tmp

C:\Documents and Settings\Administrator\Local Settings\temp\Temp11.tmp was successfully deleted

基本文件的I/O的更多相关文章

  1. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  2. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  3. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  4. SQL Server 大数据搬迁之文件组备份还原实战

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...

  5. SQLSERVER将一个文件组的数据移动到另一个文件组

    SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...

  6. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  7. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

  8. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  9. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  10. GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级

    一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...

随机推荐

  1. 性能优化之Hibernate缓存讲解、应用和调优

    JavaMelody——一款性能监控.调优工具, 通过它让我觉得项目优化是看得见摸得着的,优化有了针对性.而无论是对于分布式,还是非分布,缓存是提示性能的有效工具. 数据层是EJB3.0实现的,而EJ ...

  2. 【剑指Offer学习】【面试题60:把二叉树打印出多行】

    题目:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行. 解题思路 用一个队列来保存将要打印的结点.为了把二叉树的每一行单独打印到一行里,我们须要两个变量:一个变量表示在当前的 ...

  3. 在Swift中使用遗留的C API

    Swift的类型系统的设计目的在于简化我们的生活,为此它强制用户遵守严格的代码规范来达到这一点.毫无疑问这是一件大好事,它鼓励程序员们编写 更好更正确的代码.然而,当Swift与历史遗留的代码库.特别 ...

  4. Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Draw)过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8372924 在前面一篇文章中,我们分析了And ...

  5. ff与ie 的关于js兼容性

    FF的FIREBUG,不仅能测试JS还能检查CSS错误,是一般常用的.但它主要检查FF方面的错误,对IE就无能为力了.要测试IE,就用ieTester,它可以测试IE几乎所有版本(1.0恐怕也用不到测 ...

  6. rhel5.8安装mysql测试

    MySQL-rhel5.8 安装:在Linux下安装MySQL有三种方式:第一种以rpm的二进制文件分个安装,第二种是自己编译源码后安装,最后一种是以二进制tar.gz文件来安装(这种安装方式下载安装 ...

  7. 宏定义 define

    #define kOut -1 用一个字符串代替一个数据 用kOut表示-1(一般开头有一个小写的k) 作用: 1.为了让一些数据有意义 #define kUseId asdjlfdjafa #def ...

  8. 写sql语句注意事项

    做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等.因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为 ...

  9. 【the service mysql57 failed the most】

    异常信息: the the service mysql57 failed the most recent status change request with the messagethe servi ...

  10. HttpClient post 请求实例

    所需jar包: commons-codec-1.3.jar commons-httpclient-3.0.jar commons-logging-1.1.1.jar /** * */ package ...