黑马程序员_java_io(中)

来源:互联网 发布:知乎 那些有深度的网名 编辑:程序博客网 时间:2024/05/22 07:50

------- android培训java培训、期待与您交流! ---------- 

                                   java_io(中)

File:
  File类是io包中唯一代表磁盘文件本身的对象,File类定义了一些与平台无关的方法来操作文件,
 可以通过调用File类中的方法,实现创建.删除.重命名文件等,File类是对象主要用来获取未文件本身
 的一些信息,如文件所在的目录,文件的长度.文件的读写权限等.数据流可以将数据系写入到文件中,
 而文件也是数据流最常用的数据媒体.

 

构造方法:


 File(File parent, String child)//
parent:子路径字符串  child:父路径字符串
          根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

 

 File(String pathname) //pathname指包括文件路径(包文件名)
     通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

 

 File(String parent, String child) //
     根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

 

 File(URI uri)
     通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。


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


 File类常见方法:


  1,创建。


   boolean | createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
        和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。

 

   boolean | mkdir():创建文件夹。


   boolean | mkdirs():创建多级文件夹。


   演示:
    File f=new File("file.txt");     
    sop("create:"+f.createNewFile());//创建文件  
    sop("mkdir:"+f.mkdir());//创建文件夹   
    sop("mkdir:"+f.mkdirs());//创建多级的文件夹 
     
    ps:sop代表打印语句.
   ------------------------------------------------
  2,删除。


   boolean | delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。


   void | deleteOnExit();在程序退出时删除指定文件。

 


   演示:
    File f=new File("file.txt");
    f.deleteOnExit();//程序退出时删除指定文件
    sop("create:"+f.createNewFile());//创建文件
    sop("delete:"+f.delete());//删除文件


   ------------------------------------------------
  3,判断。


   boolean | exists():文件是否存在.


   boolean | isFile():判断是否是文件


   boolean | isDirectory():是否是一个目录


   boolean | isHidden():判断是是否是隐藏的文件


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

 


   演示:
    File f = new File("d:\\java1223\\day20\\file2.txt");
    sop("dir:"+f.isDirectory());
    sop("file:"+f.isFile());
    sop(f.isAbsolute());
   //记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
   //通过exists判断。


      -----------------------------------------------
  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。
           //如果相对路径中有上一层目录那么该目录就是返回结果。

 


  其他:
   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);
    }

 


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

     for(File f:files)//高级for
     {
      System.out.println(f);
     }
    }
    ps:其他类等详情参阅API java.io File类


------------------------------------------------------------------------------
递归:

 函数自己调用自己。
 注意:递归时一定要明确结束条件。 


 应用场景:
  当某一功能要重复使用时。
 递归要注意:
  1,限定条件。
  2,要注意递归的次数。尽量避免内存溢出。
 
 列出指定目录下文件或者文件夹,包含子目录中的内容。
 也就是列出指定目录下所有内容。
 因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
 在列出过程中出现的还是目录的话,还可以再次调用本功能。
 也就是函数自身调用自身。
 这种表现形式,或者编程手法,称为递归。

示例:

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++]);  } }}


 

用递归删除文件:
删除一个带内容的目录。
删除原理:
在window中,删除目录从里面往外删除的。
既然是从里往外删除。就需要用到递归。
示例:

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文件列表文件.

/* 思路 1.对指定的进行递归. 2.获取递归过程总所有的java文件的路径. 3.将这些路径存储到集中. 4.将集合整蛊你的数据写入到一个文件中*/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:


 Properties是hashtable的子类。
 也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。
 是集合中和IO技术相结合的集合容器。
 该对象的特点:可以用于键值对形式的配置文件。
 那么在加载数据时,需要数据有固定格式:键=值。


 构造方法摘要


 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打印值    }   }


 


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


   void | load(InputStream inStream):从输入流中读取属性列表(键和元素对)。

   void | store(Writer writer, String comments):以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。


   演示:

   

public static void loadDemo()throws IOException   {    FileReader fr=new FileReader("info.txt");//建立字符输入流对象与文件相关联    Properties prop=new Properties();//建立Properties属性类    prop.load(fr);//使用Properties的load方法.将字符输入流的数据转入Properties中    System.out.println(prop);    prop.setProperty("zhangsan","88");//将info.txt中到底值设置为88    FileOutputStream fos=new FileOutputStream("info.txt");//建立字节输出流和文件相关联    prop.store(fos,"haha");//使用Properties的store方法,将流流中的数据存储到指定的文件中    System.out.println(prop);    fr.close();//关闭流    fos.close();   }



-----------------------------------------------------------------------
练习:
 用于记录应用程序运行次数。
 如果使用次数已到,那么给出注册提示。

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,file对象。File
  2,字符串路径。String
  3,字节输出流。OutputStream
  4,PrintStream(OutputStream out, boolean autoFlush)
 //autoFlush - boolean 变量;如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区


 字符打印流:
 PrintWriter


 构造函数可以接收的参数类型:
 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());//打印.并转成大写   }  } }


 


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

合并流SequenceInputStream   (合并读取流) 


构造方法:


 SequenceInputStream(Enumeration<? extends InputStream> e)
//Enumeration:枚举       SequenceInputStream(InputStream s1, InputStream s2)
     通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。


 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:

/*需求:切割一个MP4文件.,并合并 步骤..  切割:  1.建立字符输入流和文件相关联  2.建立输出流.输出的时候分三个文件存储. 合并:  1.使用枚举的elements.返回Enumeration,因为合并流需要  2.往枚举里添加字节输入流对象.  3.建立输出流.和文件路径文件名关联.  4.输出.  */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培训、期待与您交流! ----------