黑马程序员Java基础__IO(中)

来源:互联网 发布:魔客吧还原数据密码 编辑:程序博客网 时间:2024/06/10 00:11
-----------android培训、java培训、java学习型技术博客、期待与您交流! ------------



一、 File类

一)概述:
 File类是io包中唯一代表磁盘文件本身的对象,File类定义了一些与平台无关的方法来操作文件。

  可以通过调用File类中的方法,实现创建、删除、重命名文件等,File类是对象主要用来获取文件本身 的一些信息,

如文件所在的目录、文件的长度、文件的读写权限等。

数据流可以将数据系写入到文件中, 而文件也是数据流最常用的数据媒体。


二)File类常见方法:

1、创建:

          boolean createNewFile()--->   在指定位置创建文件,若文件存在,则返回true,与输出流不同,输出流对象已建立就创建文件,如果存在,就会被覆盖。 

          boolean mkdir()--->   创建文件夹,只能创建一级目录。

          boolean mkdirs()--->   创建多级文件夹。


2、删除:

       boolean delete()   ---> 删除文件。文件存在,返回true;文件不存在或者正在被执行,返回false。

       void deleteOnExit() ---> 在程序结束时删除文件。


3、判断:

       boolean canExecute(): 当前文件是否能被执行。


       boolean exists():  当前文件是否存在。


       boolean isFile(): 当前文件是否是文件。


       boolean isDirectory():当前文件是否是文件夹(目录);注意:在判断文件对象是否是文件或目录是们必须要判断该文件对象封装的内容是否存在,通过exists判断。


       boolean isHidden():当前文件是否是隐藏文件。


       boolean isAbsolute():测试此抽象路径名是否为绝对路径名。


  4、获取信息
   String | getName():返回由此抽象路径名表示的文件或目录的名称。

 
   String | getPath():将此抽象路径名转换为一个路径名字符串。

 
   String | getParent():返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。如果相对路径中有上一层目录那么该目录就是返回结果。

 

   String | getAbsolutePath():返回此抽象路径名的绝对路径名字符串。


   long | lastModified():返回此抽象路径名表示的文件最后一次被修改的时间。

 
   long | length():返回由此抽象路径名表示的文件的长度。


 演示:
    File f = new File("file.txt");
    sop("path:"+f.getPath());
    sop("abspath:"+f.getAbsolutePath());
    sop("parent:"+f.getParent());//该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。


5.、其他
   static File[] | listRoots():列出可用的文件系统根。


   File[] | listFiles():返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。


   String[] | list():返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录


   演示:
    File f=new File("d:\\");
    String[] nums=f.list(); //列出文件和目录
     for(String s:nums)//高级for循环
     {
      System.out.println(s);
     }

 


   演示:
    public static void listRoots()
    {
      File[] files=File.listRoots();//列出可用的文件系统根

      for(File f:files)//高级for循环
      {
       System.out.println(f);
      }
    }


-----------------------------------------------------------------------


二、递归

一)概述:

对于每次循环都是用同一个功能的函数,即函数自身调用自身,这种表现形式或手法,称为递归。

二)注意:

1、限定条件,是作为结束循环用的,否则是死循环。

2、注意递归的次数,尽量避免内存溢出。因为每次调用自身的时候都会先执行下一次调用自己的发那个发,所以会不断在栈内存中开辟新空间,次数过多,会导致内存溢出。

三)应用场景:
  当某一功能要重复使用时。
 
 举例:

列出指定目录下文件或文件夹,包含子目录,即列出指定目录下所有内容。

[java] view plaincopyprint?import java.io.*;  class FileDemo3  {   public static void main(String[] args)   {    File f=new File("d:\\java0410");//创建File对象,定义一个路径    showDir(f);//往函数中传递一个路径dir   }   public static void showDir(File dir)   {    File[] files=dir.listFiles();//调用listFiles()方法.每个数组元素对应目录中的每个文件或目录      int num=0;//定义一个变量        for(File f:files)//使用高级for遍历    {       if(files[num].isDirectory())//对元素进行判断是否是文件夹.如果是使用递归.      showDir(files[num]);//递归自己调用自己     System.out.println(files[num++]);    }   }  } 

举例:

删除一个带内容的目录。

import java.io.*;  class  RemoveDir  {   public static void main(String[] args)    {      File dir = new File("d:\\testdir");//创建File对象,定义一个路径    removeDir(dir);//往函数中传递一个路径dir   }   public static void removeDir(File dir)   {    File[] files = dir.listFiles();//调用listFiles()方法.每个数组元素对应目录中的每个文件或目录        for(int x=0; x<files.length; x++)//遍历File数组    {     if(files[x].isDirectory())//遍历过程中判断是否是文件夹.如果是就递归.      removeDir(files[x]);     else      System.out.println(files[x].toString()+":-file-:"+files[x].delete());//如果不是文件夹就干掉!,并打印看看结果    }      System.out.println(dir+"::dir::"+dir.delete());//删除完文件.就把文件夹干掉!!!!   }  } 

举例:

将一指定目录中的java文件的绝对路径,存到一个文本文件中,建立一个java文件列表文件。

import java.io.*;//导入包  import java.util.*;  class  JavaFileList  {   public static void main(String[] args)    {    File dir=new File("d:\\java0410");//建立File对象.指定路径    List<File> list=new ArrayList<File>();//建立list集合存储递归到的文件    fileToList(dir,list);//往fileToList函数里面传入路径和集合        try    {     //创建路径javalist.txt文本文件     File file=new File(dir,"javalist.txt");     writeToFile(list,file.toString());//传入到writeToFile函数中    }    catch (IOException e)    {     throw new RuntimeException("创建失败");    }       }     public static void fileToList(File dir,List<File> list)   {    File[] files=dir.listFiles();//获取路径的文件和文件夹      for(File file:files)//高级for循环.File文件类型   file变量名字   files被变量的数组(或集合)    {     if(file.isDirectory())//判断是否是文件夹.如果是文件件.就递归,进文件夹里面.      fileToList(file,list);//递归穿进去刚才判断的文件夹.list集合也穿进去.因为文件都存在一个集合中     else     {      if(file.getName().endsWith(".java"))//如果是文件的话.就判断是否后缀名是.java的文件       list.add(file);//往集合中存入文件     }    }   }   //将集合中的数据存入到文本文件中   public static void writeToFile(List<File> list,String javaListFile)throws IOException   {    BufferedWriter bufw=null;//初始化BufferedWrite容器.    try    {     //建立BufferedWriter字符输出流.并指定文件路径javaListFile就是路径     bufw=new BufferedWriter(new FileWriter(javaListFile));     for(File f:list)//高级for遍历     {      String path=f.getAbsolutePath();//返回此抽象路径名的绝对路径名字符串。      bufw.write(path);//将字符传输出到文本文件javalist.txt中      bufw.newLine();//换行      bufw.flush();//刷新     }    }    catch (IOException e)    {     throw e;//抛出异常    }    finally    {     try     {      if(bufw!=null)//判断是否建立失败       bufw.close();     }     catch (IOException e)     {      System.out.pritnln("关闭字符输出流失败");      throw e;     }    }   }  }

-----------------------------------------------------------------------


 三、Properties 类

一)概述

1、Properties是Hashtable的子类,它具备Map集合的特点,而且它里面还有存储的键值对,都是字符串,无泛型定义。是集合中和IO技术想结合的集合容器。


二)特点

1)可用于键值对形式的配置文件

2)在加载时,需要数据有固定的格式,常用的是:键=值


三)构造方法

 Properties():创建一个无默认值的空属性列表。

 Properties(Properties defaults):创建一个带有指定默认值的空属性列表。


四) 常用方法

   String | getProperty(String key):用键获取值。

 

   Object | setProperty(String key, String value):设置键值对.调用 Hashtable 的方法 put。

 

   Set<String> | stringPropertyNames():返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。


演示:

public static void setAndGet()     {      Properties prop=new Properties();//创建Properties属性类            prop.setProperty("zhangsan","22");//设置键值        prop.setProperty("lise","21");        Set<String> names=prop.stringPropertyNames();//把Map转成Set取出        for(String s: names)//高级for      {       System.out.println(s+"...."+prop.getProperty(s));//打印键 调用值getProperty打印值      }     }


用于记录应用程序运行次数。

举例:

import java.io.*;  import java.util.*;  class RunCountDemo  {   public static void main(String[] args)   {     count();//调用count方法   }   public static void count()   {    //给对象初始化属性类    Properties prop=null;    File file=null;    FileInputStream fis=null;    FileOutputStream fos=null;    try    {         prop=new Properties(); //创建Properties属性类对象          file=new File("count.ini");//创建File文件对象          if(!(file.exists()))//对file进行判断是否存在.如果不存在创建一个.      file.createNewFile();         fis=new FileInputStream(file); //建立字节输入流对象.和文件相关联          prop.load(fis);//将流转换成Properties       int count=0;//计数器       String value=prop.getProperty("timp"); //获取timp的值.       if(value!=null)//判断是否为空     {      count=Integer.parseInt(value); //如果不等于空的话将值转换成Integet对象进行操作      if(count>=5)//如果判断等于>=5程序跳出      {       System.out.println("使用次数已经到");       return ;      }     }     count++;//计数器加加       fos=new FileOutputStream(file);//创建字符输出流.和文件相关联       prop.setProperty("timp",count+"");//设置键值.       prop.store(fos,"haha");//将流流中的数据存储到指定的文件中        }     catch (IOException e)//异常处理    {     throw new RuntimeException("配置文件创建失败"+e.toString());    }    finally    {     try     {      if(fis!=null)       fis.close();     }     catch (IOException e)     {      throw new RuntimeException("关闭输入流失败");     }     try     {      if(fos!=null)       fos.close();     }     catch (IOException e)     {      throw new RuntimeException("关闭输出流失败");     }        }   }  }  


-----------------------------------------------------------------------

四、打印流

一)概述:

该流提供了打印方法,可将各种类型的数据都原样打印。

二)字节打印流:PrintStream

1)构造方法中可接收的参数类型:

1、file对象:File

2、字符串路径:String

3、字符输出流:OutputStream

4、PrintStream(OutputStream out, boolean autoFlush) //autoFlush - boolean 变量;如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区。

三)字符串打印流:PrintWriter

1)构造方法中可接受的参数类型:

1、file对象:File

2、字符串路径:String

3、字节输出流:OutputStream

4、字符输出流:Writer

 5、PrintWriter(OutputStream out, boolean autoFlush)//autoFlush - boolean 变量;如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区。

举例:

import java.io.*;   class PrintWriterDemo   {    public static void main(String[] args) throws IOException    {     BufferedReader bufr=//键盘录入      new BufferedReader(new InputStreamReader(System.in));       PrintWriter out=new PrintWriter(System.out,true);//打印流对象       String len=null;       while((len=bufr.readLine())!=null)     {      if("over".equals(len))       break;      out.println(len.toUpperCase());//打印.并转成大写     }    }   }  

-----------------------------------------------------------------------

五、合并流


一)构造方法:

1)SequenceInputStream(Enumeration<? extends InputStream> e) //Enumeration:枚举       SequenceInputStream(InputStream s1, InputStream s2)

通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。


2)SequenceInputStream(InputStream s1, InputStream s2) 

通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从此 SequenceInputStream 读取的字节。


示例1:

import java.io.*;  import java.util.*;  class  SequenceDemo  {   public static void main(String[] args) throws IOException   {    Vector<FileInputStream> v=new Vector<FileInputStream>();//建立枚举      v.add(new FileInputStream("d:\\1.txt"));    v.add(new FileInputStream("d:\\2.txt"));//添加对象    v.add(new FileInputStream("d:\\3.txt"));      Enumeration<FileInputStream> en=v.elements();//使用枚举的elements,.返回Enumeration,SequenceInputStream就可以使用了      SequenceInputStream sis=new SequenceInputStream(en);      FileOutputStream fos=new FileOutputStream("d:\\4.txt");//建立字符输出流.和文件相关联      byte[] buf=new byte[1024];//建立字符数组还缓冲      int len=0;    while((len=sis.read(buf))!=-1)    {     fos.write(buf,0,len);    }    fos.close();//关闭流    sis.close();   }  }

示例2:

import java.io.*;    import java.util.*;  class SplitFile  {   public static void main(String[] args)    {    //split()    merge();   }   public static void merge()//合并文件   {    FileOutputStream fos=null;//初始化字节输入流对象    SequenceInputStream sis=null;//初始化字节输入流对象合并流    try    {     Vector<FileInputStream> v=new Vector<FileInputStream>();//建立枚举     for(int x=0;x<3;x++)     {      v.add(new FileInputStream("d:\\"+x+".mp4"));//for循环添加遍历对象.     }       Enumeration<FileInputStream> en=v.elements();////使用枚举的elements,.返回Enumeration,SequenceInputStream就可以使用了       sis=new SequenceInputStream(en);//建立合并流,往合并流中传入       fos=new FileOutputStream("d:\\4.mp4");//建立字符输出流对象.并指定文件       byte[] buf=new byte[1024*1024*10];//建立字符数组10M的       int len=0;     while((len=sis.read(buf))!=-1)     {      fos.write(buf,0,len);//往容器中存数据.     }     }    catch (IOException e)//异常    {     throw new RuntimeException("文件合并失败");    }    finally    {     try     {      if(fos!=null)       fos.close();     }     catch (IOException e)     {      System.out.println("关闭流资源失败");     }     try     {      if(sis!=null)       sis.close();     }     catch (IOException e)     {      System.out.println("关闭流资源失败");     }    }    //fos.close();    //sis.close();     }            public static void split()//切割   {    FileInputStream fis=null;//初始化对象    FileOutputStream fos=null;    try    {        fis=new FileInputStream("d:\\VID_20130414_181841.mp4");//字符输入流指定文件     byte[] buf=new byte[1024*1024*10];       int len=0;     int count=0;//定义变量来当名字       while((len=fis.read(buf))!=-1)     {      fos=new FileOutputStream("d:\\"+(count++)+".mp4");//指定路径和文件名字      fos.write(buf,0,len);//开始输出.      fos.close();     }    }    catch (IOException e)    {     throw new RuntimeException("文件切割失败");    }    finally    {     try     {      if(fis!=null)       fis.close();     }     catch (IOException e)     {      System.out.println("关闭流资源失败");     }    }          }  }

-----------android培训、java培训、java学习型技术博客、期待与您交流! ------------