zoukankan      html  css  js  c++  java
  • 学习.net中I/O的心得第一篇 初探I/O(转)

    第一篇      初探I/O

    对于一个完整意义上的程序,必定包含对数据的处理。这包括一些用户的输入,数据文件的访问等等。也正因如此,程序中的输入输出技术就显得尤其的重要。

    对于一个从C/C++过来的程序员,文件的输入输出是一件十分麻烦的事。即使在I/O中使用了缓存技术,输入输出无论是代码的复杂程度上,还是程序的运行速度上,都是一个让程序员头疼的事。

    而,从Java出现以后,这个问题似乎容易了许多。Sun公司在设计Java时使用了装饰(Decorator)模式对I/O进行设计。程序员可以很方便地通过面向对象的特性使得自己的I/O代码具有自己所需要的功能。但这其中美中不足的是Java的I/O包java.io的设计是根据Unix/Linux体系对于文件的管理方式进行设计的(在Unix/Linux中无论是数据文件、目录、硬件设备都是以文件的形式进行管理的,整个文件形式中有且只有一个根‘/’目录。这种管理方式在某种程度上大大降低管理的复杂度和难度。),对于已经熟悉了Windows文件管理模式的程序员而言,这显得十分不便。

    现在,在.net平台中也提供了类似于Java的I/O库。尤其是.Net 2.0库对I/O修改,使得.Net I/O从抄袭Java的阴影中走出来。

    下面就来看看.Net的I/O库:

    1、I/O库的基本架构

    (1)、在.Net中I/O库被存放在mscorlib.dll文件中,命名空间是System.IO。其包含五个基本的抽象类,甚至分别为

    Stream:负责对I/O进行流操作,它也是.Net I/O的核心类。基本上所有的I/O操作都离不开它。

    TextReader和TextWriter:提供对字符文本操作的抽象类。

    FileSystemInfo:这是.Net 2.0中不同于Java的一个类。它主要负责对文件信息的管理,这不仅仅是Windows操作系统中一般意义上的文件信息,这还包括目录等。这进一步增强了对文件信息的操作。

    IOException:这是I/O库中对I/O异常进行处理的类。

    (2)、下面介绍一下其基本的继承关系

    a)、文件操作流类Stream:

    继承图:Stream

              FileStream(一般文件流)

              BufferedStream(带缓存的文件流,本人强烈建议使用。)

              MemoryStream(对一块内存区域进行托管流的操作)

              UnmanagedMemoryStream(对一块内存区域进行非托管流的操作)

    b)、文本类TextReader和TextWriter:

    继承图:TextReader

              StreamReader(文本文件流读操作类)

              StringReader(对String类型以文件的方式进行读操作的类)

           TextWriter

              StreamWriter(文本文件流写操作类)

              StringWriter(对StringBuilder类型以文件的方式进行写操作的类)

    c)、异常类IOException:

    继承图:IOException

              DirectoryNotFoundException(文件夹未找到异常)

              DriveNotFoundException(驱动器未找到异常)

              EndOfStreamException(流结束异常)

              FileLoadException(文件加载异常)

              FileNotFoundException(文件未找到异常)

              PathTooLongException(路径太长异常)

    d)、文件信息类FileSystemInfo:

    继承图:FileSystemInfo

              FileInfo(文件信息类)

              DirectoryInfo(目录信息类)

    e)、其它类:

    BinaryReader和BinaryWriter,这是一个对文件流(Stream)进行二进制操作的类。它直接继承至Object类,但使用时必须使用流打开文件。

    File类,对文件进行操作的类,它提供了大量有用的静态方法,这是一个方法类。

    Directory类,对目录进行操作的类,包括取得目录下文件,新建目录、删除目录等等。

    Path类,对路径进行操作。

    DriveInfo类,这个类虽然以Info命名,但并非从FileSystemInfo中继承而来。这个类也是一个Windows特色类。若使用Mono开发在Linux平台上运行的.Net程序,其就失去了意义。它的主要功能是:取得驱动器的大小、可用空间、卷标、格式等等。

    (3)、关于文件操作的四个基本抽象类的基类MarshalByRefObject

    这是一个将I/O操作通过使用代理交换消息来跨应用程序域边界进行通讯的对象的基类。

    下面是MSDN上关于这个类的讲解:

    应用程序域是一个操作系统进程中一个或多个应用程序所驻留的分区。同一应用程序域中的对象直接通信。不同应用程序域中的对象的通信方式有两种:一种是跨应用程序域边界传输对象副本,一种是使用代理交换消息。

        MarshalByRefObject是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。不是从 MarshalByRefObject继承的对象根据值隐式封送。当远程应用程序引用根据值封送的对象时,将跨应用程序域边界传递该对象的副本。

    MarshalByRefObject对象在本地应用程序域的边界内可直接访问。远程应用程序域中的应用程序首次访问 MarshalByRefObject时,会向该远程应用程序传递代理。对该代理后面的调用将封送回驻留在本地应用程序域中的对象。

    当跨应用程序域边界使用类型时,类型必须是从 MarshalByRefObject继承的,而且由于对象的成员在创建它们的应用程序域之外无法使用,所以不得复制对象的状态。

    2、.Net I/O中一些有用的功能

    这甚时不对I/O进行详细的介绍,只介绍一些有用的功能。

    (1)、取得文本文件的所有行

    在File类中有一个方法ReadAllLines(String path, Encoding encoding),可以将文本文件中所有行取出。

    (2)、以字符串的形式取得文本文件的内容ReadAllText(String path, Encoding encoding)

    (3)、以字节数组的形式取得文件的内容ReadAllBytes(String path)

    (4)、以上操作的写操作

    WriteAllBytes(string path, byte[] bytes);

    WriteAllLines(string path, string[] contents, Encoding encoding);

    WriteAllText(string path, string contents, Encoding encoding);

    (5)向文件中追加文本

            AppendAllText(string path, string contents, Encoding encoding);

    (6)取得某路径下的所有目录

            GetDirectories(string path, string searchPattern, SearchOption searchOption);

    (7)取得某路径下的所有文件

            GetFiles(string path, string searchPattern, SearchOption searchOption);

    .Net中为程序员提供了很多很方便的I/O方法,有时间的话可以好好研究FileDirectoryDriveInfo,你会有其他的收获。

  • 相关阅读:
    CORS enabled image (Miscellaneous) – HTML 中文开发手册
    PHP fread() 函数
    iswcntrl (Strings) – C 中文开发手册
    HTML DOM createComment() 方法
    HTML draggable 事件属性
    HTML table border 属性
    dedecms开启多站点
    SVN中trunk,branches,tags用法详解
    docker:搭建lamp应用
    centos安装samba
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/890416.html
Copyright © 2011-2022 走看看