12--黑马程序员--技术总结之IO流

来源:互联网 发布:自学会计的软件 编辑:程序博客网 时间:2024/04/30 05:15

----------------------ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

一.流的相关概念

        1.流的定义
        I/O流提供一条通道程序,可以使用这条通道把源中的字节序列送到目的地。把输入流的指向称为源,程序从指向源的输入流中读取源中的数据。而输出流的指向是数据要
到达的一一个目的地,程序通过向输出流中写入数据把信息传递到目的地。虽然I/O流经常与磁盘文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口。
       Java的I/O流库提供大量的流类(在包java.io中)o其中,所有输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类,而所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。把输入流的指向称为源,程序从指向源的输入流中读取源中的数据。而输出流的指向是数据要到达的一个目的地,程序通过向输出流中写入数据把信息传递到目的地,如下图所示: 

        2.流的分类:
        1)按流向分为输入流和输出流;
        2)按传输单位分为字节流(InputStream和OutputStream)和字符流(Reader和Writer);
        3)按功能还可以分为节点流和过滤流。
        节点流:负责数据源和程序之间建立连接;(相当于裸枪)
        过滤流:用于给节点增加功能。(相当于功能零部件)
        过滤流的构造方式是以其他流位参数构造(这样的设计模式称为装饰模式)。
        注:I/O流是一类很宝贵的资源,使用完后必须调用close()方法关闭流并释放资源。在关闭流时只用关闭最外层的流。  

二.File类
        File类的对象主要用来获取文件本身的一些信息,例如文件所在的目录、文件的长度、文件读写权限等,不涉及对文件的读写操作。
        创建一个File对象的构造方法有3个:
        File (String  filename);
        File (String directoryPath, String  filename);
        File (File f,  String  filename);
        其中,filename是文件名字,directoryPath是文件的路径.f是指定成一个目录的文件。
        使用File(String filename)创建文件时,该文件被认为是与当前应用程序在同一目录中。

         1.文件的属性
        经常使用File类的下列方法获取文件本身的一些信息:
        ◆  public String getName()获取文件的名字。
        ◆  public boolean canRead()判断文件是否是可读的。
        ◆  public boolean canWrite()判断文件是否可被写入。
        ◆  public boolean exits()  判断文件是否存在。
        ◆  public long length()获取文件的长度(单位是字节)。
        ◆  public String getAbsolutePath()获取文件的绝对路径。
        ◆  public String getParcnt()获取文件的父目录。
        ◆  public boolean isFile()判断文件是否是一个正常文件,而不是目录。
        ◆  public boolean isDirectory()判断文件是否是一个目录。
        ◆  public boolean isHidden()  判断文件是否是隐藏文件。
        ◆  public long lastModified()获取文件最后修改的时间(时间是从1970年午夜至文件最后修改时刻的毫秒数)。
代码示例:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class FileDemo1 {  
  2.   
  3.     /**使用上述的一些方法,获取某些文件的信息  
  4.      * @黑马ZWF  
  5.      */  
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         File f1 = new File("G:\\新建文件夹(2)","FileDemo1.java");  
  9.         File f2 = new File("G:\\新建文件夹(2)");  
  10.         System.out.println("f1的文件名是?" + f1.getName());  
  11.         System.out.println("文件FileDemo1.java是可读的吗? " + f1.canRead());  
  12.         System.out.println("文件FileDemo1.java是可写的吗? " + f1.canWrite());  
  13.         System.out.println("G:\\新建文件夹(2)是否存在文件? " + f1.exists());  
  14.         System.out.println("FileDemo1.java的文件长度是? " + f1.length());  
  15.         System.out.println("G:\\新建文件夹(2)是文件夹吗?" + f2.isDirectory());  
  16.     }  
  17.   
  18. }  

       2.目录
       (1)创建目录
       File对象调用方法public boolean mkdir0创建一个目录,如果创建成功返回true,否则返回false(如果该目录已经存在,将返回false)o
       (2)列出目录中的文件
       如果File对象是一个目录,那么该对象可以调用下述方法列出该目录下的文件和子目录:
       ◆  public String口list0用字符串形式返回目录下的全部文件。
       ◆  public File[] listFiles()用File对象形式返回目录下的全部文件。
       有时需要列出目录下指定类型的文件,比如.java、.txt等扩展名的文件。可以使用File类的下述两个方法,列出指定类型的文件:
       ◆  public Stringo list(FilenameFilter obj)  该方法用字符串形式返回目录下的指定类型的所有文件。
       ◆  public File[] listFiles(FilenamcFilter obj)该方法用File对象返回目录下的指定类型所有文件。
       FilenameFilter是一个接口,该接口有一个方法:
       public boolean accept<File  dir, String name):
       使用list方法时,需向该方法传递一个实现FilenameFilter接口的对象。list方法执行时,参数不断回调接口方法accept(File dir,String name),accept中的参数name被实例化目录中的一个文件名,参数dir为调用list的当前目录对象,当接口方法返回true时,list方法就将目录dir中的文件存放到返回的数组中。
’     3.文件的创建与删除
       当使用File类创建一个文件对象后,例如:
       File f = new File("C:\\myletter", "Ietter. txt"),
       如果C:\myletter目录中没有名字为letter.txt丈件,文件对象f调用方法:
       public boolean  createNewFile()
       可以在C:\myletter目录中建立一个名字为letter.txt的文件。
       文件对象调用方法:
       public boolean delete()
       可以删除当前文件,例如:
       f .delete();

代码示例
 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class FileDemo2 {  
  2.   
  3.     /**列出E:/chaper9目录下扩展名是.java文件的名字,并删除了E:/chaper9中的E.java文件  
  4.      * @黑马ZWF  
  5.      */  
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         try {  
  9.             File dir=new File("F:\\chaper9");  
  10.          File deletedFile=new File(dir,"E.java");  
  11.          FileAccept acceptCondition =new FileAccept("java");  
  12.          File fileName[]=dir.listFiles(acceptCondition);  
  13.          for(int i=0;i< fileName.length;i++) {  
  14.              System.out.println("文件名称:"+fileName[i].getName());  
  15.          }  
  16.          boolean boo=deletedFile.delete();  
  17.            if(boo){  
  18.                System.out.println("文件:"+deletedFile.getName()+"被删除");  
  19.            }   
  20.   
  21.         }  
  22.         catch (NullPointerException e){           
  23.         }  
  24.     }  
  25.   
  26. }  
  27. class FileAccept implements FilenameFilter {    
  28.     String str=null;  
  29.     FileAccept(String s) {  
  30.         str="."+s;  
  31.     }  
  32.    public boolean accept(File dir,String name) {  
  33.        return name.endsWith(str);  
  34.    }                
  35. }  

输出结果:


三.FileInputStream类

        如果用户的文件读取需求比较简单,那么用户可以使用FileInputStream类,该类是从InputStream中派生出来的简单输入类,该类的实例方法都是从InputStream类继承来的。
        FileInputStream类的常用构造方法如下:
        FilelnputStream<String name>
        Filelnpue Stream(File   file)
       第一个构造方法使用给定的文件名name创建一个FilelnputStream对象。第二个构造方法使用File对象创建FilelnputStream对象。
       1.使用文件输入流读取文件
       我们将要建立的许多程序都需要从文件中检索信息。文件输入流(输入流的子类)提供对文件的存取。为了读取文件,使用文件输入流构造方法来打开一个到达该文件的输入流(源就是这个文件,输入流指向这个文件)。
       例如,为了读取一个名为myfile.dat的文件,建立一个文件输入流对象,代码如下:
       FileInputStream  istream - new  FileInputStream( "myfile. dat")岁
       或
       File  f=new File ("myfile.dat");
       FileInputStream  istream=new  FileInputStream(f);
       2.处理I/O异常
      当使用文件输入流构造方法建立通往文件的输入流时,可能会出现错误(也被称为异常)。例如,试图要打开的文件可能不存在,就出现I/O错误,Java生成一个出错信号,它使用一个IOException对象来表示这个出错信号。程序必须使用一个try-catch块检测并处理这个异常。例如,为了把一个文件输入流对象与一个文件关联起来,使用类似于下面所示的代码:
       try  {
       FileInputStream  ins=new  FileInputStream( "myfile.dat");  //输入流

         }

          catch (IOException e) {
               System. out.println("File  read  error: " + e);  //文件I/O错误
       }
      由于I/O操作对于错误特别敏感,所以许多流类的构造方法和读写方法都抛出I/O异常,程序必须捕获处理这些异常。
      3.从输入流中读取字节
      输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数据。read方法给程序提供一个从输入流中读取数据的基本方法。
      read方法的格式如下:
      int read();
      read方法从输入流中顺序读取源中的单个字节数据,该方法返回字节值(0~255之间的一个整数),如果到达源的末尾,该方法返回-1。
      read方法还有其他一些形式口这些形式能使程序把多个字节读到一个字节数组中:
      int  read (byte b[]);
      int  read (byte b[],  int offr  int  len);
      其中,off参数指定read方法把数据存放在字节数组b中的什么地方,len参数指定该方法将读取的最大字节数。上面所示的这两个read方法都返回实际被读取的字节个数,如果到达源的末尾,该方法返回-1。
      FileInputStream流顺序地读取文仵,只要不关闭流,每次调用read方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭。
      4.关闭流
     虽然Java在程序结束时自动关闭所有打开的流,但是当我们使用完流后,显式地关闭任何打开的流仍是一个良好的习惯。一个被打开的流可能会用尽系统资源,这取决于平台和实现。如果没有关闭那些被打开的流,那么在这个或另一个程序试图打开另一个流时,这些资源可能得不到。关闭输出流的另一个原因是把该流缓冲区的内容冲洗掉(通常冲洗到磁盘文件上)o在操作系统把程序所写到输出流上的那些字节保存到磁盘上之前,内容有时被存放在内存缓冲区中,通过调用close()方法,可以保证操作系统把流缓冲区的内容写到它的目的地。

       四. FileOutputStream类
         与FilelnputStream类相对应的类是FileOutputStream类o FileOutputStream提供了基本的文件写入能力。除了从OutputStream类继承来的方法以外,FileOutputStream类还有两个构造方法:
        FileOutputStream (String name)
        FileOutputStream (File  file)
       第一个构造方法使用给定的文件名name创建一个FileOutputStream对象。第二个构造方法使用File对象创建FileOutputStream对象。
       可以使用write方法把字节写入到输出流到达目的地,如图10.2所示。
       write的格式如下:
       public void write (byte b[])
       其功能是写b.length个字节到输出流。
        public void.write (byte b[],int off,int len)
       其功能是从给定字节数组中起始于偏移量o行处写len个字节到输出流,参数b是存放了数据的字节数组:off是数据的起始偏移量:len是要输出的字节数。
        FileOutputStream流顺序地写文件,只要不关闭流,每次调用writer方法就顺序地向输出流写入内容,直到流被关闭。

代码示例:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class FileDemo3 {  
  2.   
  3.     /**本程序读取从键盘输入的一行文本并将其存储,到文件line.txt中。当用户运行该应用程序时,需要输入一行文本并按下Enter键。  
  4.      * @黑马ZWF  
  5.      */  
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         int b;  
  9.         byte buffer[] = new byte[100];  
  10.         try{  
  11.             System.out.println("输入一行文本,并存入磁盘:");  
  12.             b = System.in.read(buffer);   //把从键盘敲入的字符存入buffer  
  13.             FileOutputStream writefile=new FileOutputStream("line.txt");  
  14.             writefile.write(buffer,0,b); // 通过流把 buffer写入到文件line.txt  
  15.         }  
  16.         catch(IOException e) {  
  17.             System.out.println("Error "+e);  
  18.         }  
  19.     }  
  20. }  

输出结果

打开文件夹可以发现已经产生了"line.txt"的文件

0 0
原创粉丝点击