日常文件操作的Java函数,(以控制台输出方法) 

一、找出磁盘里占用空间最大的文件(文件夹)

获取给定路径下的所有信息:路径必须是:"X:\\"或"X:/"的形式

   
   
   
   
  1. /** 
  2.      * 获得指定目录下的所有文件信息 
  3.      * @param absolutepath 
  4.      */ 
  5.     public void getPathInfo(String absolutepath){ 
  6.         String path=absolutepath; 
  7.         File file=new File(absolutepath); 
  8.         NumberFormat nf=NumberFormat.getInstance(); 
  9.         nf.setMaximumFractionDigits(2); 
  10.         long[] longNum=new long[100000]; 
  11.         System.out.println("【所在盘符】:"+path.substring(0,1)+"\r"+"【总大小】:"+file.getTotalSpace()/1000000.00D+"MB"+"  约:"+nf.format(file.getTotalSpace()/1000000000.00D)+"GB"); 
  12.         System.out.println("【剩余空间】:"+nf.format(file.getFreeSpace()/1000000.00D)+"MB"+"  约:"+nf.format(file.getFreeSpace()/1000000000.00D)+"GB"); 
  13.         int len=0;          //对象数量 
  14.         int isHidden=0;     //隐藏文件数量 
  15.         int isDirectory=0;  //文件夹数量 
  16.         int isFile=0;       //文件数量 
  17.         File[] files=file.listFiles();  //获得指定目录下的所有对象的File类型数组 
  18.         for(int i=0;i
  19.             if(files[i].isDirectory()){ 
  20.                 isDirectory+=1
  21.             }else if(files[i].isFile()){ 
  22.                 isFile+=1
  23.             }else if(files[i].isHidden()){ 
  24.                 isHidden+=1
  25.             } 
  26.             len+=1
  27.         } 
  28.         System.out.println("【共】:"+len+"个对象"); 
  29.         System.out.println("【文件夹】:"+isDirectory+"个"); 
  30.         System.out.println("【文件】:"+isFile+"个"); 
  31.         System.out.println("【隐藏文件】:"+isHidden+"个"+"\r"+"【列表】:"); 
  32.         for(int i=0;i
  33.             if(files[i].isDirectory()){ 
  34.                 System.out.println("[文件夹]:"+files[i].getName()+ 
  35.                         "             占用空间:" 
  36.                         +nf.format((new FileTest().calcDirectorySize(new File(files[i].getAbsolutePath())))/1000000.00D)+"MB"); 
  37.                 longNum[i]=new FileTest().calcDirectorySize(new File(files[i].getAbsolutePath())); 
  38.             }else if(files[i].isFile()){ 
  39.                 System.out.println("[文件]:"+files[i].getName()); 
  40.             }else if(files[i].isHidden()){ 
  41.                 System.out.println("[隐藏文件]:"+files[i].getName()); 
  42.             } 
  43.         } 
  44.         System.err.println("占用空间最大的文件夹:"+new FileTest().compareLong(longNum)+"byte"); 
  45.     } 

写这断代码的起因是:我的一个分区的空间快满了,而里面的文件和文件夹有很多,很难找出到底是哪一个占用着大量的空间,于是我想用一个简单循环遍历的方法找出幕后真凶:)

上面的代码要配合下面两个关键代码使用:

   
   
   
   
  1. /** 
  2.      * 递归调用,获取一个目标文件夹的大小 
  3.      * @param file 
  4.      * @return 
  5.      */ 
  6.     public long calcDirectorySize(File file){ 
  7.         long directorySize=0L; 
  8.         File[] files=file.listFiles(); 
  9.         for(int i=0;i
  10.             if(files[i].isDirectory()){ 
  11.                 directorySize+=calcDirectorySize(files[i]); 
  12.             }else
  13.                 directorySize+=files[i].length(); 
  14.             } 
  15.         } 
  16.         return directorySize; 
  17.     } 

   
   
   
   
  1. /** 
  2.      * 比较一组long类型的数谁大 
  3.      * @param num 
  4.      * @return 
  5.      */ 
  6.     public long compareLong(long[] num){ 
  7.         long tmp=0L; 
  8.         for(int i=0;i1;i++){ 
  9.             if(num[i]>num[i+1]){ 
  10.                 tmp=num[i]; 
  11.                 num[i]=num[i+1]; 
  12.                 num[i+1]=tmp; 
  13.             } 
  14.         } 
  15.         return tmp; 
  16.     } 

二、要重命名的文件太多,有没有批处理的方法?

对给定文件夹里的所有文件进行重命名

   
   
   
   
  1. /** 
  2.      * 对一个文件夹内的所有制定格式文件重命名 
  3.      * @param files     重命名文件所在的文件夹,必须是绝对路径,如:X:\\directoryname 
  4.      * @param startVal  要截取的开始字符 
  5.      * @param endVal    要截取的结束字符 
  6.      */ 
  7.     public void renameFile(String path,char startVal,char endVal){ 
  8.         File[] files=new File(path).listFiles(); 
  9.         String newName=null
  10.         int fileQuantity=0
  11.         int totalFileQuantity=0
  12.         int updatedFileQuantity=0
  13.         for(int j=0;j
  14.             fileQuantity+=1;    //计算给定路径下的总对象数 
  15.             String fileName=files[j].getName(); 
  16.             if(fileName.charAt(0)==startVal&&fileName.contains(endVal+"")){ 
  17.                 totalFileQuantity+=1;   //计算给定路径下要修改的对象数 
  18.             } 
  19.         } 
  20.         System.out.println("正在执行重命名操作……"); 
  21.         //下面是主要方法 
  22.         for(int i=0;i
  23.             String fileName=files[i].getName(); //获取文件名(加后缀) 
  24.             if(fileName.charAt(0)==startVal){ 
  25.                 try
  26.                 //最终要变成的名字 
  27.                 newName=fileName.substring(fileName.indexOf(endVal)+1); 
  28.                 //截取目标路径的所有父级前缀 
  29.                 String prefix=files[i].getAbsolutePath().substring(0,files[i].getAbsolutePath().indexOf(files[i].getName())); 
  30.                 new File(files[i].toString()).renameTo(new File(prefix+newName)); 
  31.                 updatedFileQuantity+=1//计算已经重命名好的对象数  
  32.                 }catch(Exception e){ 
  33.                     System.err.println("重命名文件期间发生了一个不可逆转的错误……"); 
  34.                     e.printStackTrace(); 
  35.                 } 
  36.             } 
  37.         } 
  38.         System.out.println("目标文件夹共:"+fileQuantity+" 个对象"); 
  39.         System.out.println("需要修改的文件共:"+totalFileQuantity+" 个"); 
  40.         System.out.println("已成功修改的文件:"+updatedFileQuantity+" 个"); 
  41.     } 

上面的代码只能使用"x:\\directoryname"这样的路径形式,即:对一个文件夹进行批处理操作,不能对单个文件进行操作,这个问题可以通过将要重命名的单个文件放在一个文件夹里解决,但意义不大,这个函数主要是对文件夹内的大量文件进行统一批处理使用的。

PS:这个函数的主要方法是:renameTo(),这是File类里封装好的方法,这个方法让我省了不少精力。

三、查看硬盘的详细信息

这个函数是顺手写的

   
   
   
   
  1. /** 
  2.      * 打印硬盘的详细信息 
  3.      */ 
  4.     public static void getHardDriverInfo(){ 
  5.         NumberFormat n=NumberFormat.getInstance();  //格式化数字 
  6.         n.setMaximumFractionDigits(2);  //设置小数点后的精度 
  7.         File[] fileLst=File.listRoots();//获得所有驱动器的File类型数组 
  8.         int driverQuantity=0;           //分区数量 
  9.         double driverTotalSize=0L;      //分区总大小 
  10.         double driverFreeSize=0L;       //分区剩余容量 
  11.         for(int i=0;i//循环File数组 
  12.             if(fileLst[i].length()<=0){ //如果分区的大小为0 
  13.                 System.err.println("盘符:"+fileLst[i].toString().substring(0,1)+"   这是一个空的磁盘分区"); 
  14.             }else
  15.                 System.out.println("盘符:"+fileLst[i].toString().substring(0,1
  16.                         +"   总大小:"+n.format(fileLst[i].getTotalSpace()/1000000000.00D)+"(GB)" 
  17.                         +"  剩余容量:"+n.format(fileLst[i].getFreeSpace()/1000000000.00D)+"(GB)" 
  18.                         +"   利用率:"+FileTest.calcUtilization(fileLst[i].getTotalSpace(), fileLst[i].getFreeSpace())+"%"); 
  19.             } 
  20.             driverTotalSize+=fileLst[i].getTotalSpace();    //总大小 
  21.             driverFreeSize+=fileLst[i].getFreeSpace();      //剩余大小 
  22.             driverQuantity+=1;                              //分区数量 
  23.         } 
  24.         n.setMaximumFractionDigits(1); 
  25.         System.out.println("总分区数:"+driverQuantity+" 个"+"\r" 
  26.                 +"硬盘总容量:"+n.format(driverTotalSize/1000000.00D)+"MB  约等于:" 
  27.                 +n.format(driverTotalSize/1000000000.00D)+"(GB)"+"   总利用率:"+n.format(((driverTotalSize-driverFreeSize)/driverTotalSize)*100)+"%"+"\r" 
  28.                 +"硬盘剩余容量:"+n.format(driverFreeSize/1000000.00D)+"MB  约等于:" 
  29.                 +n.format(driverFreeSize/1000000000.00D)+"(GB)"+"   总剩余率:"+n.format((driverFreeSize/driverTotalSize)*100)+"%"); 
  30.     } 

PS:这里所说的硬盘就是你计算机里的硬盘,多硬盘和移动硬盘没有试过,USB闪存之类的试过,不行,只能检索根驱动器。这个方法很奇怪。

上面的函数要结合下面的代码实现:

   
   
   
   
  1. /** 
  2.      * 计算 磁盘分区利用率=((总数-剩余数)/总数)*100 
  3.      * @param totalsize 
  4.      * @param freesize 
  5.      * @return 
  6.      */ 
  7.     public static String calcUtilization(long totalsize,long freesize){ 
  8.         String percentage=null
  9.         NumberFormat nf=NumberFormat.getInstance(); 
  10.         nf.setMaximumFractionDigits(1); 
  11.         percentage=nf.format(((totalsize-freesize)/Double.parseDouble(String.valueOf(totalsize)))*100); 
  12.         return percentage; 
  13.     } 

PS:这个方法很简单吧:)

总结:通过上面三个方法,让我熟悉了File类的不少函数和属性,以后万一用到也不会着急啦:)