java文件夹相关操作 演示样例代码
package org.rui.io;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;
/**
* 文件夹列表器 測试
*
* @author lenovo
*
*/
//Args:"C:/Users/lenovo/Pictures/screen/*\.jpg"
public class DirList {
public static void main(String[] args) {
String[] argss=new String[1];
String s=DirectoryDemo.class.getPackage().getName().replace(".","/");
String dirPath=new File("").getAbsolutePath()+"\\src\\"+s;
//path=".";
argss[0]="D.*\\.java";
File path=new File(dirPath);
String[] list = null;
if(argss.length==0)
{
list=path.list();
}else
{
System.out.println("all file list==>"+Arrays.toString(path.list()));
//显示文件夹以下的文件并用正则匹配
list=path.list(new DirFilter(argss[0]));
}
//排序打印
Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);
for(String dirItem:list)
System.out.println(dirItem);
}
}
/**
* output:
all file list==>[D.txt, Directory.java, DirectoryDemo.java, DirList.java, fout, inout, Main.java, PPrint.java, zzz.class]
Directory.java
DirectoryDemo.java
DirList.java
*
*/
/**
* 这是一个策略模式的样例
* @author lenovo
*
*/
class DirFilter implements FilenameFilter
{
private Pattern pattern;
public DirFilter(String regex)
{
this.pattern=Pattern.compile(regex);
}
public boolean accept(File dir, String name) {
return pattern.matcher(name).matches();
}
}
package org.rui.io;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
/**
* 文件夹有用工具
* @author lenovo
*
*/
public class Directory {
public static File[] local(File dir,final String regex)
{
return dir.listFiles(new FilenameFilter()
{
private Pattern pa=Pattern.compile(regex);
public boolean accept(File dir, String name)
{
return pa.matcher(name).matches();
}
});
}
//overloaded重载
public static File[] local(String path,final String regex)
{
return local(new File(path),regex);
}
public static class TreeInfo implements Iterable<File>
{
public List<File> files=new ArrayList<File>();
public List<File> dirs=new ArrayList<File>();
public Iterator<File> iterator() {
return files.iterator();
}
void addAll(TreeInfo other)
{
files.addAll(other.files);
dirs.addAll(other.dirs);
}
public String toString()
{
return "dirs: "+PPrint.pformat(dirs)+
"\n\nfiles:"+PPrint.pformat(files);
}
public static TreeInfo walk(String start,String regex)
{
return recurseDirs(new File(start),regex);
}
public static TreeInfo walk(File f,String regex)
{
return recurseDirs(f,regex);
}
public static TreeInfo walk(File f)
{
return recurseDirs(f,".*");
}
public static TreeInfo walk(String start)
{
return recurseDirs(new File(start),".*");
}
//递归
static TreeInfo recurseDirs(File f,String reg)
{
TreeInfo result=new TreeInfo();
for(File item :f.listFiles())
{
if(item.isDirectory())
{
result.dirs.add(item);//加入文件夹集合
result.addAll(recurseDirs(item,reg));//递归回方法 循环子文件夹
}else
{
if(item.getName().matches(reg))
{
result.files.add(item);//加入文件
}
}
}
return result;
}
//////////////////////////mian
public static void main(String[] args) {
String[] argss=new String[1];
//C:\\Users\\lenovo\\Pictures\\screen
argss[0]=".";
if(argss.length==0)
System.out.println(walk("."));
else
for(String arg:argss){
System.out.println(walk(arg));
}
}
}
}
/**output:
*
//result.addAll(recurseDirs(item,reg));//以下是不递归的输出,文件太多 不好理解
dirs: [.\.settings, .\bin, .\src]
files:[.\.classpath, .\.project]
---------------------------------------------------------------------
----------格式化后的输出--------------
---------------------------------------------------------------------
dirs: [
.\.settings
.\bin
.\src
]
files:[
.\.classpath
.\.project
]
*/
package org.rui.io;
import java.util.Arrays;
import java.util.Collection;
/**
* 机灵打印机 以使输出更easy浏览
* @author lenovo
*
*/
public class PPrint {
public static String pformat(Collection<?
> c)
{
if(c.size()==0)return "[]";
StringBuilder result=new StringBuilder("[");
for(Object elem:c)
{
if(c.size()!=1)
result.append("\n");
result.append(elem);
}
if(c.size()!=1)
result.append("\n");
result.append("]");
return result.toString();
}
public static void pprint(Collection<?> c)
{
System.out.println(pformat(c));
}
public static void pprint(Object[] c)
{
System.out.println(pformat(Arrays.asList(c)));
}
}
package org.rui.io;
import java.io.File;
import java.util.regex.Pattern;
public class DirectoryDemo {
public static void main(String[] args)
{
String s=DirectoryDemo.class.getPackage().getName().replace(".","/");
String path=new File("").getAbsolutePath()+"\\src\\"+s;
//System.out.println(path);
//path=".";
PPrint.pprint(Directory.TreeInfo.walk(path).dirs);
//all files beginning with "t"
for(File f:Directory.local(path,"D.*"))
System.out.println(f);
System.out.println("----------------");
for(File f:Directory.local(path, "D.*\\.java"))
System.out.println(f);
System.out.println("================");
//class files containing "z" or "Z"
for(File f:Directory.TreeInfo.walk(path,".*[Zz].*\\.class"))
System.out.println(f);
}
}
/**
[
D:\Users\liangrui\workspace\thinking\src\org\rui\io\fout
D:\Users\liangrui\workspace\thinking\src\org\rui\io\fout\f
D:\Users\liangrui\workspace\thinking\src\org\rui\io\inout
]
D:\Users\liangrui\workspace\thinking\src\org\rui\io\D.txt
D:\Users\liangrui\workspace\thinking\src\org\rui\io\Directory.java
D:\Users\liangrui\workspace\thinking\src\org\rui\io\DirectoryDemo.java
D:\Users\liangrui\workspace\thinking\src\org\rui\io\DirList.java
----------------
D:\Users\liangrui\workspace\thinking\src\org\rui\io\Directory.java
D:\Users\liangrui\workspace\thinking\src\org\rui\io\DirectoryDemo.java
D:\Users\liangrui\workspace\thinking\src\org\rui\io\DirList.java
================
D:\Users\liangrui\workspace\thinking\src\org\rui\io\zzz.class
*/
package org.rui.io;
import java.io.File;
import java.io.IOException;
import java.util.regex.Pattern;
/**
* 更近一步创建一个文件夹工具,它能够在文件夹中穿行。
* 这是策略设计模式的还有一个演示样例
* Strategy 接口内嵌在processFile中,使得假设你希望实现它。就必须实现ProcessFiles.Strategy
* 它为读者提供了很多其它的上下文信息。
*
*
*
* @author lenovo
*
*/
public class ProcessFiles {
//策略
public interface Strategy
{
void process(File file);
}
private Strategy strategy;
private String ext;
public ProcessFiles(Strategy strategy,String ext)
{
this.strategy=strategy;
this.ext=ext;
}
public void start(String[] args)
{
try {
if(args.length==0)
processDirectoryTree(new File("."));
else
for(String arg:args)
{
File fileArg=new File(arg);
if(fileArg.isDirectory())//假设是文件夹
processDirectoryTree(fileArg);
else
if(!arg.endsWith(ext))//假设后缀不同样,则加上
arg+="."+ext;//文件后缀
strategy.process(new File(arg).getCanonicalFile());//依教规的
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
////////walk=步行
private void processDirectoryTree(File root) throws IOException {
for(File file:Directory.TreeInfo.walk(
root.getAbsoluteFile(),
".*\\."+ext
))
strategy.process(file.getCanonicalFile());
}
//demonstration of how to use
public static void main(String[] args) {
new ProcessFiles(new ProcessFiles.Strategy() {
public void process(File file) {
System.out.println(file);
}
}, "java").start(args);;
}
}
/**output:
D:\Users\liangrui\workspace\thinking\src\Concatenation.java
D:\Users\liangrui\workspace\thinking\src\org\rui\array\AssemblingMultidimensionalArrays.java
D:\Users\liangrui\workspace\thinking\src\org\rui\array\AutoboxingArrays.java
D:\Users\liangrui\workspace\thinking\src\org\rui\array\Bean.java
.......................
..............
*/
package org.rui.io;
import java.io.File;
/**
* 文件夹检查及创建
* @author lenovo
*
*/
public class MakeDirectories {
//提示信息
private static void usage()
{
System.err.println(
"Usage:MakeDirectories path1...\n"+
"Creates each path\n"+
"usage:makedirectories -d path1....\n"+
"deletes each path\n"+
"usage make directories -r path1 path2\n"+
"Renames from path1 to path2"
);
System.exit(0);
}
//输出文件信息
private static void fileDate(File f)
{
System.out.println("absolute path:"+f.getAbsolutePath()
+"\ncal read:"+f.canRead()
+"\ncan Write:"+f.canWrite()
+"\n name:"+f.getName()
+"\nparent:"+f.getParent()
+"\nlength:"+f.length()
+"\npath:"+f.getPath()
+"\nlastmodiffied:"+f.lastModified()
);
if(f.isFile())
System.out.println("it is a file");
else if(f.isDirectory())
System.out.println("it s a directory");
}
/////////////////////main test///////////////////////////////////////
public static void main(String[] args) {
String argss[]=new String[1];
argss[0]="MakeDirectoriesTest";
if(argss.length<1) usage();
if(argss[0].equals("-r"))
{
if(argss.length!=3)
{
usage();
}
File old=new File(argss[1]),rname=new File(argss[2]);
old.renameTo(rname);
fileDate(old);
fileDate(rname);
return; //exit main
}
int count=0;
boolean del=false;
if(argss[0].equals("-d"))
{
count++;
del=true;
}
count--;
while(++count<argss.length)
{
File f=new File(argss[count]);
if(f.exists())//假设存在
{
System.out.println(f+" exists");
if(del)//删除文件文件夹
{
System.out.println("deleting..."+f);
f.delete();
}
}else
{//创建文件文件夹
if(!del)
{
f.mkdirs();
System.out.println("created:"+f);
}
}
fileDate(f);
}
}
}
/**output:(80% match)
created:MakeDirectoriesTest
absolute path:D:\Users\liangrui\workspace\thinking\MakeDirectoriesTest
cal read:true
can Write:true
name:MakeDirectoriesTest
parent:null
length:0
path:MakeDirectoriesTest
lastmodiffied:1403013856223
it s a directory
*/