2008-04-29

文件读写实例模板

关键字: java文件读写

在公司经常做一些文件分析及修改的工具。大多数的同事用vb,也有人用perl。我刚开始也学着用vb和perl来做。后来做了几次后发现,对于文件操作和字符串匹配Java更有优势。perl的正则表达式是很强大,但是一般的应用根本用不着那么深的分析。而vb对于字符串的操作实在是不敢恭维。举个简单的例子,判断一个字符串是否包含一个子串。java中只需要
String s=“Hello,World”;
if(s.contains("llo")){}就可以了
而vb则需要先判断子串在全串中的位置,根据返回的值来判断是否包含。vb中连截取子串都感觉很繁琐。perl语言实在是太随心所欲了,好多的东西是用特定的符合来表示,极其考验我的记忆力。
下面写个简单的文件读写操作,算是我工作常用的一个模板。包括了文件过滤器,目录及文件的递归遍历,文件的读写操作和字符串的分析。没有好的例子,所以不用到正则表达式,其实Java中也有正则表达式匹配的内容。不过根据个人经验,String类的方法已经足够强大。文件读写用的是字符流(以前老搞不清楚字符流跟字节流到底指什么,工作后才恍然大悟)
程序从目录开始分析,通过文件过滤器把根目录中的文件(包括子目录)放入文件数组。如果是目录递归执行上一过程,文件则进行读取操作。
Java把目录也看做文件,可以用.isDirectory()方法来判断是否目录

import java.io.*;
class EFileFilter implements FileFilter{//一个文件过滤器
	public boolean accept(File f){
		if(!f.getName().endsWith(".java")){//这里设计过滤文件的规则
			return true;
		}
		return false;
	}
}
public class RFile {
	public static void directory(File f){//目录分析操作
		File[] fl=f.listFiles(new EFileFilter());//将目录中的文件用过滤器过滤后的文件赋给fl数组。
		//File[] fl=f.listFiles();如果不带参数则把目录中的所有文件赋给fl文件数组。
		for(int i=0;i<fl.length;i++){
			if(fl[i].isDirectory()){//如果此文件是目录的话,递归调用directory()方法,使能够遍历
				directory(fl[i]);//递归
			}
			else{
				readFile(fl[i]);//进入单个文件的读写操作
			}
		}
	}
	public static void readFile(File f){//单个文件的读写操作
		try{
			StringBuffer stb=new StringBuffer();//相比String能提高较大的性能,这点在做Lucene时候体会较深
			File newD=new File("d:\\new\\");//新文件存放的目录
			if(!newD.isDirectory()){
				newD.mkdirs();//如果目录不存在则创建
			}
			File newFile=new File(newD.getAbsoluteFile()+f.getName());//新文件
			FileWriter fw=new FileWriter(newFile);//文件写字符流
			BufferedReader br=new BufferedReader(new FileReader(f));//文件读字符流
			String s;
			while((s=br.readLine())!=null){
				System.out.println(s);//打印文件的内容	
				if(bString(s)){//调用分析字符串的方法
					stb.append(s);//如果满足条件则写到新文件中
				}
			}
			fw.append(stb);
			fw.close();//一定要记得关闭
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	public static boolean bString(String s){
		//对于String,java有很多实用的方法,可以去查文档,下边注释掉的是我工作中经常用到的一些
		/*if(s.startsWith("")||s.endsWith("")||s.contains("")||s.charAt(4)=='a'){
			return true;
		}*/
		return true;
	}
	public static void main(String[] args) {
		File fd=new File("d:\\");//定义要分析的目录
		directory(fd);//从目录开始执行
	}

}

 

评论
zwm512327 2008-04-30
谢谢上面朋友使我进步
icefire 2008-04-30
引用
fw.close();//一定要记得关闭


有异常时,也要关闭!应该在finally中!
naofantian 2008-04-30
不错……收藏了……
发表评论

您还没有登录,请登录后发表评论