JavaSE_IO流_文件+递归+Properties

PropertiesDemo

package temp;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Properties;
import java.util.Set;

import org.junit.Test;
/*public Set<String> stringPropertyNames()返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。其键或值不是 String 类型的属性被忽略。 
返回的 set 不受 Properties 对象支持。对此 Properties 的改变不能在该 set 中反映出来,反之亦然。 
返回:
此属性列表中的键集,其中该键及其对应值是字符串,包括默认属性列表中的键。
从以下版本开始: 1.6 */
public class PropertiesDemo {
   @Test
   public void method9() throws IOException {
      // 注册限制!五次
      File confile=new File("times.properties");
      //健壮性判断,如果文件不存在,则创建新文件~,如果文件不存在,则创建新文件~
      if (!confile.exists()) {
         confile.createNewFile();
      }
      FileInputStream fis=new FileInputStream(confile);
      Properties pro=new Properties();
      pro.load(fis);
      //创建一个计数器
      int count=0;
      //取出使用次数
      String times=pro.getProperty("timeused");
      System.out.println(times);
      if (times!=null) {
         //如果有值,则字符串转成数字
         count=Integer.parseInt(times);
         if(count>=5){
            throw new RuntimeException("试用次数已到,请购买正式版!");
         }
      }
      //如果value为null,说明是初次使用!
      //但是,无论哪种情况,计数器都要增加
      count++;
      pro.setProperty("timeused", count+"");
      System.out.println("您已经使用了: "+count+"次");
      //全部修改完成后,才创建输出流,因为会覆盖掉File
      FileOutputStream fos=new FileOutputStream(confile);
      pro.store(fos, "reg_times");
      fos.close();
      fis.close();
   }
   @Test
   public void method8() throws IOException {
      // 对已有的配置信息进行修改,然后存入到文件中持久化保存!
      File file=new File("info.txt");
      //健壮性判断,如果文件不存在,则创建新文件~
      if (!file.exists()) {
         file.createNewFile();
      }
      FileReader fr=new FileReader(file);
      Properties pro=new Properties();
      //注意1.6才开始有的~
      pro.load(fr);
//      pro.list(System.out);
      pro.setProperty("sg", "33");
      //注意,修改完毕之后,再关联输出流!因为输出流会覆盖掉原文件
      FileWriter fw=new FileWriter(file);
      pro.store(fw, "my names and ages ");
      fw.close();
      fr.close();
   }
   @Test
   public void method8_1() throws IOException {
      // 对已有的配置信息进行修改,然后存入到文件中持久化保存!
      File file=new File("info.txt");
      //健壮性判断,如果文件不存在,则创建新文件~
      if (!file.exists()) {
         file.createNewFile();
      }
      FileInputStream in=new FileInputStream(file);
      Properties pro=new Properties();
      pro.load(in);
      pro.list(System.out);
      pro.setProperty("wg", "43");
      pro.setProperty("钟鸣栊翠寺", "鸡唱稻香村");
      //文件打开后显示这个
      //\u949F\u9E23\u680A\u7FE0\u5BFA=\u9E21\u5531\u7A3B\u9999\u6751
      //注意,修改完毕之后,再关联输出流!因为输出流会覆盖掉原文件
      FileOutputStream out=new FileOutputStream(file);
      pro.store(out, "name  vs   age");
      in.close();
      out.close();
   }
   @Test
   public void method7() throws IOException {
      // myLoad模拟实现load方法 用字符流,显示不出Unicode字符
      Properties pro=new Properties();
      BufferedReader bufr=new BufferedReader(new FileReader("info.txt"));
      String line=null;
      while ((line=bufr.readLine())!=null) {
         if (line.startsWith("#")) {
            //如果是注释,就继续下一次循环
            continue;
         }
         String[] arr=line.split("=");
         pro.setProperty(arr[0], arr[1]);
      }
      pro.list(System.out);
   }
   @Test
   public void method6() throws IOException {
      //读入(加载)配置信息
      /*public void load(InputStream inStream)
                throws IOException从输入流中读取属性列表(键和元素对)。
     输入流按 load(Reader) 中所指定的、简单的面向行的格式,
     并假定使用 ISO 8859-1 字符编码;
     即每个字节都是 Latin1 字符。
     对于非 Latin1 的字符和某些特殊字符,
     可以使用 Unicode 转义以键和元素的形式来表示它们。 
      此方法返回后,指定的流仍保持打开状态。 
      参数:      inStream - 输入流。 
      抛出:       IOException - 如果读取输入流时发生错误。 
      IllegalArgumentException - 如果输入流包含错误的 Unicode 转义序列。
      从以下版本开始:       1.2 */
      Properties pro=new Properties();
      FileInputStream fis=new FileInputStream("info.txt");
      pro.load(fis);//已经加载了
      pro.list(System.out);//在控制台显示了!
   }
   @Test
   public void method5() throws IOException {
/*public void store(OutputStream out,String comments)throws IOException
以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,
将此 Properties 表中的属性列表(键和元素对)写入输出流。 
此方法未 编写此 Properties 表 默认表的属性(如果有)。 
此方法以 store(Writer) 中指定的相同格式输出注释、属性键和值,
注意以下几点不同: 
使用 ISO 8859-1 字符编码写入该流。 
注释中不是 Latin-1 的字符
针对其适当的十六进制值 xxxx 以 \\uxxxx 的形式写入。 
属性键或值中小于\ \u0020 的字符和大于\ \u007E 的字符
针对适当的十六进制值 xxxx 以 \\uxxxx 的形式写入。 
写入各个项后,刷新输出流。
此方法返回后,输出流仍保持打开状态。 
参数:out - 输出流。comments - 属性列表的描述。 
抛出: 
IOException - 如果将此属性列表写入指定的输出流时,
抛出 IOException。 
ClassCastException -
 如果此 Properties 对象包含任意非 String 的键或值。 
NullPointerException - 如果 out 为 null。
从以下版本开始: 1.2 */
      Properties pro=new Properties();
      pro.setProperty("june", "22");
      pro.setProperty("sg", "25");
      pro.setProperty("lily", "19");
      FileOutputStream fos=new FileOutputStream("info.txt");
//      pro.store(fos, "names+age");
      pro.store(fos, "姓名和年龄");
      //#\\u59D3\\u540D\\u548C\\u5E74\\u9F84
   }
   @Test
   public void method4() {
      // list列出系统的Properties,并打印到控制台System.out类型就是PrintStream
      Properties pro=System.getProperties();
      pro.list(System.out);//系统的打印流是标准的输出流!System.out类型就是PrintStream
   }
   @Test
   public void method3() {
      /*public void list(PrintStream out)将属性列表输出到指定的输出流。
      此方法对调试很有用。 
      参数:      out - 输出流。 
      抛出:       ClassCastException - 如果此属性列表中的任何键不是字符串。*/
      Properties pro=new Properties();
      pro.setProperty("june", "22");
      pro.setProperty("sg", "25");
      pro.setProperty("lily", "19");
      pro.list(System.out);//系统的打印流是标准的输出流!System.out类型就是PrintStream
   }
   @Test
   public void method2() {
      //pro.stringPropertyNames()取出所有元素!
      Properties pro=new Properties();
      pro.setProperty("june", "22");
      pro.setProperty("sg", "25");
      pro.setProperty("lily", "19");
      pro.setProperty("sg", "18");//修改,键相同,值覆盖!
      //关键!牢记!JDK1.6后才有的新方法~
      Set<String> names=pro.stringPropertyNames();
      for (String string : names) {
         String value=pro.getProperty(string);
         System.out.println(string+" : "+value);
      }
   }
   @Test
   public void method1() {
      // Set<String> names=pro.stringPropertyNames()取出所有元素!
      Properties pro=new Properties();
      pro.setProperty("june", "22");
      pro.setProperty("sg", "25");
      pro.setProperty("lily", "19");
      //关键!牢记!JDK1.6后才有的新方法~
      Set<String> names=pro.stringPropertyNames();
      for (String string : names) {
         String value=pro.getProperty(string);
         System.out.println(string+" : "+value);
      }
   }
}


FileDemo1

package temp;

import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
import org.junit.Test;
/*pathSeparatorChar
public final char pathSeparatorChar 与系统有关的 路径分隔符。
此字段被初始为包含系统属性 path.separator 值的第一个字符。
此字符用于分隔以路径列表 形式给定的文件序列中的文件名。
在 UNIX 系统上,此字段为 ':';在 Microsoft Windows 系统上,它为 ';'
 
String getParent() 
返回此抽象路径名父目录的路径名字符串;
如果此路径名没有指定父目录,则返回 null。 
File getParentFile() 
返回此抽象路径名父目录的抽象路径名;
如果此路径名没有指定父目录,则返回 null。 

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

String[] list(FilenameFilter filter) 
返回一个字符串数组,
这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。 

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

File[] listFiles(FileFilter filter) 
返回抽象路径名数组,
这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 

File[] listFiles(FilenameFilter filter) 
返回抽象路径名数组,
这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。*/ 


// java删除不走回收站
public class FileDemo1 {
   @Test
   public void method17() {
      // 深度遍历文件和文件夹 注意反斜杠 要转义~
      //File dir=new File("H:\\ios\\JavaSE基础视频");
      File dir=new File("F:\\红楼梦");
      listAllFiles_2(dir,0);
      /*遍历结果如下:
|---文件夹:F:\红楼梦
|    |---F:\红楼梦\87央视版《红楼梦》剧本.txt   
|    |---F:\红楼梦\_红楼梦中的诗词曲赋经典语句摘抄.doc   
|    |---F:\红楼梦\《刘心武揭秘红楼梦》合集-作者刘心武.txt   
|    |---F:\红楼梦\《红楼梦》全部诗词.doc   
|    |---F:\红楼梦\《红楼梦》全部诗词.wav   大小:37M
|    |---F:\红楼梦\人物.txt   
|    |---文件夹:F:\红楼梦\刘兰芳评书《红楼梦》
|    |    |---F:\红楼梦\刘兰芳评书《红楼梦》\红楼梦_001.mp3   大小:5M
|    |    |---F:\红楼梦\刘兰芳评书《红楼梦》\红楼梦_108.mp3   大小:5M
|    |---F:\红楼梦\判词.txt   
|    |---F:\红楼梦\天上掉下个林妹妹.mp3   大小:1M
|    |---F:\红楼梦\百家讲坛_红楼梦.txt   
|    |---文件夹:F:\红楼梦\红楼梦87版主题曲
|    |    |---F:\红楼梦\红楼梦87版主题曲\DSCN1304.JPG   
|    |    |---F:\红楼梦\红楼梦87版主题曲\Various - 红楼梦87版主题曲.cue   
|    |    |---F:\红楼梦\红楼梦87版主题曲\Various - 红楼梦87版主题曲.wav   大小:455M
|    |    |---F:\红楼梦\红楼梦87版主题曲\红楼梦87版主题曲.log   
|    |---F:\红楼梦\红楼梦人物关系图.gif   
|    |---F:\红楼梦\红楼梦前80回(红研所校注本第三版-人民文学出版社2013).pdf   大小:47M
|    |---F:\红楼梦\红楼梦诗词全集.doc   
|    |---F:\红楼梦\红楼梦诗词曲赋鉴赏.TXT   
|    |---F:\红楼梦\红楼梦诗词鉴赏.doc   
|    |---F:\红楼梦\红楼梦全部诗词.doc   
|    |---F:\红楼梦\红楼梦魇.txt   
|    |---F:\红楼梦\脂砚斋重评石头记.txt   
|    |---F:\红楼梦\葬花吟.txt   
|    |---F:\红楼梦\葬花吟.wav   大小:3M */
   }
   //自定义方法:   深度遍历文件和文件夹
   public void listAllFiles_2(File dir,int level) {
      // 深度遍历文件和文件夹,递归,带缩进level的哦!
            //首先输出dir的目录路径
            sop(getSpace(level)+"文件夹:"+dir.getAbsolutePath());
            level++;//进入文件夹,缩进计数器就自加1
            //File[] listFiles()返回一个抽象路径名数组, 
            //这些路径名表示此抽象路径名表示的目录中的文件。 
            File[] files=dir.listFiles();
            for (int i = 0; i < files.length; i++) {
               if (files[i].isDirectory()) {
                  listAllFiles_2(files[i],level);//如果文件夹,就继续递归
               } else {
                  sop(getSpace(level)+files[i].getAbsolutePath()+"   大小是:"+files[i].length()/1024/1024+"M");
               }
            }
   }
   //listAllFiles_2方法中用到!根据文件层次,输出空格数~
   public String getSpace(int level) {
      // getSpace(level)用来加缩进的!根据层次!
      StringBuilder sb=new StringBuilder();
      sb.append("|---");
      for (int i = 0; i < level; i++) {
         //每次在头部插入"|    "
         sb.insert(0, "|    ");
      }
      return sb.toString();
   }
   
   @Test
   public void test(){
      //演示自定义方法 listAllFiles_1 
      File dir=new File("F:\\红楼梦");
      listAllFiles_1(dir);
   }
   public void listAllFiles_1(File dir) {
      // 初级版:深度遍历文件和文件夹,递归!不带缩进
      //首先输出dir的目录路径
      sop("文件夹:"+dir.getAbsolutePath());
      File[] files=dir.listFiles();
      for (int i = 0; i < files.length; i++) {
         if (files[i].isDirectory()) {
            listAllFiles_1(files[i]);//如果还是文件夹继续递归
         } else {
            sop("file:"+files[i].getAbsolutePath());
         }
      }
   }
   @Test
   public void method16() {
      // File.list(FilenameFilter filter) 根据文件名过滤器,返回过滤后的文件名数组
      //设计者并不知道如何过滤,故提供一个接口,让调用者实现该接口
      File file=new File("F:\\红楼梦");
      String[] names=file.list(new FilenameFilterByContain("红楼梦"));
      for (String string : names) {
         System.out.println(string);
      }
      /*没有后缀名的就是文件夹了~
         87央视版《红楼梦》剧本.txt
         刘兰芳评书《红楼梦》
         百家讲坛_红楼梦.txt
         红楼梦87原版电视剧主题歌曲
         红楼梦前80回(红研所校注本第二版-人民文学出版社2005).pdf
         红楼梦诗词曲赋鉴赏.TXT
         红楼梦魇.txt*/
   }
   @Test
   public void method15() {
      // File.list(FilenameFilter filter) 根据文件名过滤器,返回过滤后的文件名数组
      //设计者并不知道如何过滤,故提供一个接口,让调用者实现该接口
      // 指定文件夹下的文件名后缀过滤器(不含子目录)
      File file=new File("F:\\红楼梦");
      String[] names=file.list(new FilenameFilterBySuffix(".mp3"));
      for (String string : names) {
         System.out.println(string);
      }
      //天上掉下个林妹妹.mp3
   }
   //文件过滤后打印所有隐藏文件!
   @Test
   public void method14() {
      //FileFilter接口的方法是 accept(File pathname)
      //指定的文件过滤器:内部如果是隐藏文件 就为true
      File f=new File("c:\\");
      File[] files=f.listFiles(new FileFilterByHidden());
      for (File file : files) {
         System.out.println(file);//过滤后的全是隐藏文件!
         //文件的toString方法 打印的是绝对路径~
      }
   }
   @Test
   public void method13() {
/*      public String[] list(FilenameFilter filter)返回一个字符串数组,
 * 这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
 * 除了返回数组中的字符串必须满足过滤器外,此方法的行为与 list() 方法相同。
 * 如果给定 filter 为 null,则接受所有名称。
 * 否则,当且仅当在此抽象路径名及其表示的目录中的文件名
 * 或目录名上调用过滤器的 
 * FilenameFilter.accept(java.io.File, java.lang.String) 方法返回 true 时,
 * 该名称才满足过滤器。 
      参数:      filter - 文件名过滤器 
      返回:      字符串数组,
      这些字符串指定此抽象路径名表示的目录中给定 filter 能接受的文件和目录。
      如果目录为空,或者没有名称被过滤器接受,那么该数组将为空。
      如果抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。 */
      File f=new File("c:\\");
      String[] names=f.list(new FilenameFilterByEndsWithJava());
      //上面的FilenameFilter的accept方法被执行了N次,N为目录下文件和文件夹的sum
      for (String string : names) {
         System.out.println(string);
      }
   }
   @Test
   public void method12() {
      // 获取目录下的文件及文件夹内容
//      File f=new File("c:\\a.txt");//如果封装的是一个文件,而不是目录,则发生空指针异常
      File f=new File("c:\\");
      String[] name=f.list();
      System.out.println(name);
      //如果封装的是一个文件,这个是null,否则是个数组[Ljava.lang.String;@10f6d3
      for (String string : name) {//如果封装的是一个文件,而不是目录,则发生空指针异常
         sop(string);
      }
   }

   /*public void method11() {
       //下面这三个方法,低版本的JDK不支持
      //单位是字节,转换成GB,/1024/1024/1024
      File f=new File("c:\\");
      sop("getFreeSpace      "+f.getFreeSpace());//单位是字节
      sop("getUsableSpace      "+f.getUsableSpace());
      sop("getTotalSpace      "+f.getTotalSpace());
   }*/
   @Test
   public void method10() {
      /*public File[] listRoots()列出可用的文件系统根。 
      特定 Java 平台可以支持零个或更多个分层组织的文件系统。
      每个文件系统有一个 root 目录,可以从这里到达文件系统中的所有其他文件。
      例如,Windows 平台为每个活动驱动器提供了一个根目录;
      UNIX 平台只有一个根目录,即 "/"。
      可用文件系统根的设置受各种系统级操作的影响,
      比如可移动介质的插入和弹出,以及断开或卸载那些物理磁盘或虚拟磁盘。 
      此方法返回一个 File 对象数组,这些对象表示可用文件系统根的根目录。
      可以保证本地机器上物理存在的任何文件的规范路径名都以此方法返回的根之一开始。 
      位于其他一些机器上的文件的规范路径名是通过远程文件系统协议
      (比如 SMB 或 NFS)访问的,它们可能以此方法返回的根之一开始,
      也可能不是这样。
      如果远程文件的路径名在语法上无法与本地文件的路径名进行区分,
      那么它将以此方法返回的根之一开始。
      例如,此方法将返回表示 Windows 平台上映射为网络驱动器根目录的 File 对象,
      而不返回包含 UNC 路径名的 File 对象。 
      与此类中的大多数方法不同,此方法不抛出安全性异常。如果存在安全管理器,且其 SecurityManager.checkRead(java.lang.String) 方法拒绝对特定根目录进行读访问,那么该目录将不会出现在结果中。 
      返回:
      表示可用文件系统根的 File 对象数组;如果无法确定根集,则返回 null。如果没有文件系统,那么该数组将为空。      */
      File[] files=File.listRoots();
      for (File file : files) {
         sop(file+"");
      }
      /*
      C:\
      D:\
      E:\
      F:\
      G:\
      H:\
      I:\哪儿来的I盘?*/
   }
   @Test
   public void method9() throws InterruptedException {
      // renameTo,应该始终检查返回值,以确保重命名操作成功。
      //同一文件夹下才为重命名!不同文件夹下为剪切!
      /*public boolean renameTo(File dest)重新命名此抽象路径名表示的文件。 
      此方法行为的许多方面都是与平台有关的:
      重命名操作无法将一个文件从一个文件系统移动到另一个文件系统,
      该操作不是不可分的,如果已经存在具有目标抽象路径名的文件,
      那么该操作可能无法获得成功。应该始终检查返回值,以确保重命名操作成功。 
      参数:      dest - 指定文件的新抽象路径名 
      返回:      当且仅当重命名成功时,返回 true;否则返回 false*/ 
      Thread.sleep(5000);
      File f1=new File("c:\\diamonds.mp3");
      File f2=new File("c:\\diamonds_remaneTo.mp3");
      boolean b=f1.renameTo(f2);
      sop(b+"");//true,重命名了!
      Thread.sleep(5000);
      File f3=new File("c:\\diamonds_remaneTo.mp3");
      File f4=new File("e:\\diamonds.mp3");
       b=f3.renameTo(f4);
      sop(b+"");//true,剪切了!C盘没有了!E盘中出现了!
      Thread.sleep(5000);
      File f5=new File("e:\\diamonds.mp3");
      File f6=new File("e:\\javase\\diamondsTo.mp3");
      b=f5.renameTo(f6);
      sop(b+"");//true,剪切了!E盘没有了!E盘下javase文件夹中出现了!
      Thread.sleep(5000);
   }
   @Test
   public void method8() {
      // 判断是否存在,是否是文件,文件夹
      //abc.txt位于该java工程的根目录
      File f=new File("abc.txt");
      boolean b=f.exists();
      sop(b+"");//true存在
      boolean c=f.isDirectory();
      sop(c+"");//false 不是目录
      boolean d=f.isFile();
      sop(d+"");//true是文件
      boolean e=f.isHidden();
      sop(e+"");//false  文件未隐藏
   }
   @Test
   public void method7() throws InterruptedException {
      // 千万注意:  如果文件夹abc不存在,则需用mkdir创建
      //但是mkdir不能创建多级目录,
      //要创建多级目录,请用mkdirs
      //delete删除也只会删除最底层的那个文件夹
      File f=new File("abc.txt\\abc.doc");
//      f.mkdir();
      f.mkdirs();
      Thread.sleep(5000);
      boolean b=f.delete();
      sop("删除:"+b);
   }
   @Test
   public void method_6() throws InterruptedException {
      // 创建文件夹
      File f=new File("abc.txt");
      Thread.sleep(5000);
      boolean b=f.mkdirs();
      sop("创建文件夹们:"+b);
      //如果文件已经存在,则失败~创建文件夹们:false
      Thread.sleep(5000);
      b=f.delete();
      sop("删除:"+b);
      //删除:true
   }
   @Test
   public void method6() throws InterruptedException {
      // 创建文件夹
            File f=new File("abc");
            Thread.sleep(5000);
            boolean b=f.mkdirs();
            sop("创建文件夹们:"+b);
            //创建文件夹们:true
            Thread.sleep(5000);
            b=f.delete();
            sop("删除:"+b);
            //删除:true
   }
   @Test
   public void method5() throws InterruptedException {
      // 删除 文件
            File f=new File("abc.txt");
            f.mkdir();
            /*boolean b=f.delete();
            sop(b+"");*/
            //虚拟机JVM结束的时候删除~   
            f.deleteOnExit();
            Thread.sleep(3000);
   }
   @Test
   public void method4() throws IOException {
      // 创建文件  createNewFile与流不同,文件如果已经在,则创建失败!
      File f=new File("abc.txt");
      boolean b=f.createNewFile();//与流不同,文件如果已经在,则创建失败!
      sop(b+"");
   }
   @Test
   public void method3() {
      //获取文件最后修改时间,就格式化时间成字符串
      File f=new File("abc.txt");
      long time=f.lastModified();
      //将时间毫秒值作为参数会传入,转为日期对象
      Date d=new Date(time);
      //获得1个日期时间格式化实例对象!
      DateFormat df=DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
      df=DateFormat.getDateTimeInstance(0,1);
      //调用日期格式化器的格式化方法
      String str=df.format(d);
      sop(str);
      //2013年10月17日 下午02时50分16秒
      //2014年1月1日 下午08时13分06秒
      //2014年1月1日 星期三 下午08时13分06秒
   }
   @Test
   public void method2() {
      //File类 : 获取
//      File f=new File("e:\\abc.txt");
      File f=new File("abc.txt");
      sop("getName:   "+f.getName());
      sop("getPath:   "+f.getPath());//等同于new File里面的参数!
      sop("getAbsolutePath:   "+f.getAbsolutePath());
      sop(f.getParent());//null如果 是 相对路径 ,返回null
      sop("length:      "+f.length());
      sop("length:      "+f.lastModified());//1381992616093
      /*getName:   abc.txt
      getPath:   abc.txt
      getAbsolutePath:   E:\javase\webwork\source_code\abc.txt
      null
      length:      0
      length:      1388578386093*/
   }

   public void sop(String string) {
      System.out.println(string);
   }
   @Test
   public void method1() throws IOException {
      // File类的构造函数和separator
/*   public final char separatorChar与系统有关的默认名称分隔符。
      此字段被初始化为包含系统属性 file.separator 值的第一个字符。
      在 UNIX 系统上,此字段的值为 '/';在 Microsoft Windows 系统上,它为 '\\'。*/
      /*public final String separator与系统有关的默认名称分隔符,
      为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。*/ 

      /*      构造方法摘要 
      File(File parent, String child) 
                根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 
      File(String pathname) 
                通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 
      File(String parent, String child) 
                根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 
      File(URI uri) 
                通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。 
*/
//      下面就将依次演示!
      File f1=new File("e:\\a.txt");//File(String pathname) 
      boolean b=f1.createNewFile();
      System.out.println(b);//与流不同,如果文件存在,不会覆盖,而且返回false
      File f2=new File("e:\\",    "a.txt");//File(String parent, String child)
      File f3=new File("e:\\");//File(String pathname) 
      File f4=new File(f3, "a.txt");
      System.out.println(f4);
      //      e:\a.txt
      File f5=new File("e:"+File.separator+"b"+File.separator+"c.txt");
      System.out.println(f5);
      //      e:\b\c.txt
      
   }

}


FileDemo2

package temp;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
import org.junit.Test;
// java删除不走回收站
public class FileDemo2 {
   // 深度遍历文件和文件夹 注意反斜杠 要转义~
   @Test
   public void imgArray() {
      File dir=new File("E:\\图片收藏\\瀑布流\\images\\jpg");
      listAllFiles_2(dir,0);
   }
   //自定义方法:   深度遍历文件和文件夹
   public void listAllFiles_2(File dir,int level) {
      // 深度遍历文件和文件夹,递归,带缩进level的哦!
            level++;//进入文件夹,缩进计数器就自加1
            //File[] listFiles()返回一个抽象路径名数组, 
            //这些路径名表示此抽象路径名表示的目录中的文件。 
            File[] files=dir.listFiles();
            String realPath;
            String fileName;
            //每次注意要记得改这个~
            int index=0;
            String folder;
            for (int i = 0; i < files.length; i++) {
               if (files[i].isDirectory()) {
                  listAllFiles_2(files[i],level);//如果文件夹,就继续递归
               } else {
                  realPath=files[i].getAbsolutePath();
                  fileName=realPath.substring(realPath.lastIndexOf("\\")+1);
                  fileName=fileName.toLowerCase();
                  //fileName=fileName.replace(".jpg", "");
                  /*if(fileName.length()>=12){
                     fileName=fileName.replace(fileName.substring(12), "");
                  }*/
                  //fileName=" imgArray["+index+++"] == "+"E:/图片收藏/瀑布流/images/jpg/"+fileName;
                  //System.out.println(realPath);
                  if (fileName.endsWith(".jpg")) {
                     folder="jpg"; 
                  } else if(fileName.endsWith(".gif")) {
                     folder="gif"; 
                  } else if(fileName.endsWith(".png")){
                     folder="png"; 
                  } else if(fileName.endsWith(".bmp")){
                     folder="bmp"; 
                  } else{
                     folder="jpg";
                  }
                  System.out.println("imgArray["+index+++"] =\"images/"+folder+"/"+fileName+"\";");
               }
            }
   }
   //listAllFiles_2方法中用到!根据文件层次,输出空格数~
   public String getSpace(int level) {
      // getSpace(level)用来加缩进的!根据层次!
      StringBuilder sb=new StringBuilder();
      sb.append("|---");
      for (int i = 0; i < level; i++) {
         //每次在头部插入"|    "
         sb.insert(0, "|    ");
      }
      return sb.toString();
   }
   @Test
   public void delete_zjpg(){
      //演示自定义方法 listAllFiles_1 
      File dir=new File("E:\\图片收藏\\瀑布流\\images");
      delete_listAllFiles(dir);
   }
   public static void main(String[] args) {
      File dir=new File("E:\\图片收藏\\瀑布流\\images");
      delete_listAllFiles(dir);
   }
   public static void delete_listAllFiles(File dir) {
      // 初级版:深度遍历文件和文件夹,递归!不带缩进
      File[] files=dir.listFiles();
      for (int i = 0; i < files.length; i++) {
         if (files[i].isDirectory()) {
            delete_listAllFiles(files[i]);//如果还是文件夹继续递归
         } else {
            if (files[i].getName().equals("紫茉莉\\%20彩吧"+".jpg")) {
               files[i].delete();
               throw new RuntimeException(files[i].getName()+"删除成功");
            }
         }
      }
   }
   @Test
   public void test(){
      //演示自定义方法 listAllFiles_1 
      File dir=new File("F:\\红楼梦");
      listAllFiles_1(dir);
   }
   public void listAllFiles_1(File dir) {
      // 初级版:深度遍历文件和文件夹,递归!不带缩进
      //首先输出dir的目录路径
      sop("文件夹:"+dir.getAbsolutePath());
      File[] files=dir.listFiles();
      for (int i = 0; i < files.length; i++) {
         if (files[i].isDirectory()) {
            listAllFiles_1(files[i]);//如果还是文件夹继续递归
         } else {
            sop("file:"+files[i].getAbsolutePath());
         }
      }
   }
   @Test
   public void method16() {
      // File.list(FilenameFilter filter) 根据文件名过滤器,返回过滤后的文件名数组
      //设计者并不知道如何过滤,故提供一个接口,让调用者实现该接口
      File file=new File("F:\\红楼梦");
      String[] names=file.list(new FilenameFilterByContain("红楼梦"));
      for (String string : names) {
         System.out.println(string);
      }
   }
   public void sop(String string) {
      System.out.println(string);
   }
}


RecurrenceDemo1

package temp;
import java.io.File;

import org.junit.Test;
public class RecurrenceDemo1 {
   // Recurrence递归!
   @Test
   public void test_removeDir() {
      File dir=new File("d:\\abc");
      removeDir(dir);
   }
   public void removeDir(File dir) {
      /*自定义方法:深度遍历,删除文件夹,从里面往外删除,
      如果判断是目录继续遍历,
      否则,如果是文件直接删除
      最后,目录下的文件全删除后,才开始删除目录
      千万小心,java删除不经回收站~*/
      File[] files=dir.listFiles();
      for (File file : files) {
         if (file.isDirectory()) {
            removeDir(file);
         } else {
            System.out.println(file+"      :"+file.delete());
         }
      }
      //上面循环已经将目录下的文件全干掉了,
      //最后开始删除目录
      System.out.println(dir+"      :"+dir.delete());
   }
   @Test
   public void test_recurSum(){
      int i=recurSum(5);
      System.out.println(i);
   }
   public int recurSum(int i) {
      //Recurrence递归!求和
      if (i==1) {
         return 1;
      } else {
         return i+recurSum(i-1);
      }
   }
   @Test
   public void test_toBin2(){
      System.out.println("开始主程序");
      toBin2(4);
      //结果是 1000
   }
   //递归十进制转二进制
   //先递归,后打印~符合要求
   private static void toBin2(int num) {
            if (num>0) {
               toBin2(num/2);
               System.out.print(num%2);
            }
   }
   
   
   
   @Test
   public void test_toBin1(){
      toBin1(8);
      //结果是 0001
   }
   //toBin转换十进制为2进制
   //先打印,后递归...结果是倒着的~
   private static void toBin1(int num) {
      if (num>0) {
         System.out.print(num%2);
         toBin1(num/2);
      }
   }
}


Recurrence_FilenameFilter_List_Stream_Demo

package temp;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
public class Recurrence_FilenameFilter_List_Stream_Demo {
    /*Recurrence的意思是递归对指定目录的内容进行深度遍历
   并文件名按指定过滤器的内容进行过滤,
   将过滤后的内容保存到List容器,并通过流输出到文件!*/
   public static void main(String[] args) throws IOException {
      File dir=new File("E:\\javase\\ework");//指定目录
      //匿名类实现文件名过滤器(按后缀)
      FilenameFilter filter=new FilenameFilter(){
         public boolean accept(File dir, String name) {
            return name.endsWith(".java");
         }
      };
      //创建一个集合,保存后缀名为java的符合条件的文件
      List<File> list=new ArrayList<File>();
      //调用自定义函数getAllFiles,得到所有的文件
      getAllFiles(dir,filter,list);
      //创建输出目的地!
      File destFile=new File(dir, "javalist.txt");
      //健壮性判断,如果文件不存在,则创建~
      if (!destFile.exists()) {
         destFile.createNewFile();
      }
      //调用自定义方法writeToFile将结果写到目的地
      writeToFile(list,destFile);
   }
   //自定义方法writeToFile将结果写到目的地
   public static void writeToFile(List<File> list, File destFile) throws IOException {
      BufferedWriter bufw=new BufferedWriter(new FileWriter(destFile));
      for (File file : list) {
         System.out.println(file);
         bufw.write(file.getAbsolutePath());
         bufw.newLine();
         bufw.flush();//这两句代码经常同时出现~
      }
      bufw.close();
   }
   //自定义方法getAllFiles,得到所有的文件
   public static void getAllFiles(File dir, FilenameFilter filter,
         List<File> list) {
      File[] files=dir.listFiles();
      for (File file : files) {
         if (file.isDirectory()) {
            //如果还是目录,接着递归
            getAllFiles(file, filter, list);
         } else {
            //如果是文件,就判断是否满足filter的accept方法,若满足,添加到list
            if (filter.accept(file, file.getName())) {
               //System.out.println(file);
               //将文件添加到集合list<File>
               list.add(file);
            }
         }
      }
   }
}


Recurrence_FilenameFilter_List_Stream_Demo2

package temp;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

public class Recurrence_FilenameFilter_List_Stream_Demo2 {
   // 对指定目录的内容进行深度遍历,
   //并文件名按指定过滤器的内容进行过滤,
   //将过滤后的内容保存到List容器,并通过流输出到文件!
   @Test
   public void method1() throws IOException {
      //指定目录
      File dir=new File("F:\\KuGou");
      //匿名实现文件名过滤器(按后缀)
      FilenameFilter filter=new FilenameFilterBySuffix(".mp3");
      //创建一个集合,保存后缀名为mp3的符合条件的文件
      List<File> list=new ArrayList<File>();
      //调用函数,得到所有的文件
      getAllFiles(dir,filter,list);
      //创建输出目的地!
      File destFile=new File(dir, "mp3list.txt");
      //文件健壮性判断,如果不存在,则创建新文件
      if (!destFile.exists()) {
         destFile.createNewFile();
      }
      //调用方法将结果写到目的地
      writeToFile(list,destFile);
   }
   
   /*自定义方法:根据指定文件名过滤器,
   迭代指定目录下所有文件和文件夹
   将过滤的所有文件对象保存到List集合*/
   public static void getAllFiles(File dir, FilenameFilter filter,
         List<File> list) {
      //列出目录下所有文件和文件夹
      File[] files=dir.listFiles();
      for (File file : files) {
         //如果还是目录,接着递归
         if (file.isDirectory()) {
            getAllFiles(file, filter, list);
         } else {
            //如果是文件,就判断是否满足filter的accept方法,若满足,添加到list
            if (filter.accept(file, file.getName())) {
               //System.out.println(file);
               list.add(file);//将文件添加到集合list<File>
            }
         }
      }
   }
   //自定义方法:迭代集合,将其保存的所有File对象的名字,写到指定文件~
   public void writeToFile(List<File> list, File destFile) throws IOException {
      BufferedWriter bufw=new BufferedWriter(new FileWriter(destFile));
      for (File file : list) {
         System.out.println(file);
         bufw.write(file.getAbsolutePath());
         bufw.newLine();
         bufw.flush();
         //newLine 和flush同在,切记~
      }
      bufw.close();
   }
}


FileFilterByHidden

package temp;
import java.io.File;
import java.io.FileFilter;
public class FileFilterByHidden implements FileFilter {
   public boolean accept(File file) {
      // accept(File file)
      //文件过滤器,只显示隐藏文件~
      return file.isHidden();
   }
}

FilenameFilterByContain

package temp;
import java.io.File;
import java.io.FilenameFilter;
public class FilenameFilterByContain implements FilenameFilter {
   private String subStr;
   //构造的时候,传进来一个:子字符串,并用成员记住!
   public FilenameFilterByContain(String subStr) {
      super();
      this.subStr = subStr;
   }
   //覆盖接口FilenameFilter的方法,
   //判断文件名(name 根据参数File dir内部自己取到)是否包含子字符串(subStr)
   public boolean accept(File dir, String name) {
      //其实 这个文件名过滤器的accept方法被调用好多次
      return name.contains(subStr);
   }
}


FilenameFilterBySuffix

package temp;
import java.io.File;
import java.io.FilenameFilter;
public class FilenameFilterBySuffix implements FilenameFilter {
	private String suffix;
	//构造的时候,传进来一个:后缀字符串,并用成员记住!
	public FilenameFilterBySuffix(String suffix) {
		super();
		this.suffix = suffix;
   }
   //覆盖接口FilenameFilter的方法,
   //判断文件名(name 根据参数File dir内部自己取到)是否是指定的后缀结尾
   public boolean accept(File dir, String name) {
      return name.endsWith(suffix);
   }
}


FilenameFilterByEndsWithJava

package temp;
import java.io.File;
import java.io.FilenameFilter;
public class FilenameFilterByEndsWithJava implements FilenameFilter {
   public boolean accept(File dir, String name) {
      //其实 这个文件名过滤器的accept方法被调用好多次
      System.out.println("accept方法被调用---"+dir+" : "+name);
      return name.endsWith(".java");
   }

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值