首页 > 代码库 > 循环处理目录下文件框架

循环处理目录下文件框架

经过会遇到对指定目录下文件循环处理的情况,往往是写个函数进行循环处理,每次都这样,代码重复量很大。

于是想到总结一下经验,简化后续做目录下文件循环处理流程。

1.最简框架,可以对目录进行循环处理,对于每个文件需要如何处理则由子类实现

package cn.jerryhouse.util.file;

import java.io.File;

public abstract class FileProcessor {
	private long totalFileCount = 0;
	private long processedFileCount = 0;
	public void processFiles(File[] dirs) throws Exception {
		for (File file : dirs) {
			processFile(file);
		}
	}

	public void processFile(File file) throws Exception {
		if (file.isFile()) {
			if (isFileAccepted(file)) {
				handleFile(file);
				processedFileCount++;
			}
			totalFileCount++;
		} else {
			File[] files = file.listFiles();
			for (File fileInDir : files) {
				processFile(fileInDir);
			}
		}
	}

	protected boolean isFileAccepted(File file) throws Exception {
		return true;
	}

	protected abstract void handleFile(File file);

	public long getTotalFileCount() {
		return totalFileCount;
	}

	public long getProcessedFileCount() {
		return processedFileCount;
	}
}

2. 以行为单位进行文件读取,适用于要遍历目录下所有文件,对文件中所有行进行读取处理

package cn.jerryhouse.util.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public abstract class LineReaderProcessor extends FileProcessor {
	private long totalFileCount = 0;
	private long processedFileCount = 0;
	public void processFiles(File[] dirs) throws Exception {
		for (File file : dirs) {
			processFile(file);
		}
	}

	public void processFile(File file) throws Exception {
		if (file.isFile()) {
			if (isFileAccepted(file)) {
				handleFile(file);
			}
		} else {
			File[] files = file.listFiles();
			for (File fileInDir : files) {
				processFile(fileInDir);
			}
		}
	}

	protected boolean isFileAccepted(File file) throws Exception {
		return true;
	}

	protected void handleFile(File file)
	{
		try {
			BufferedReader br = new BufferedReader(new FileReader(file));
			String line;
			while((line=br.readLine())!=null)
			{
				readLine(file,line);
			}
			br.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	protected abstract void readLine(File file,String line);

	public long getTotalFileCount() {
		return totalFileCount;
	}

	public long getProcessedFileCount() {
		return processedFileCount;
	}
}


3. 以行为单位进行文件读取,适用于要遍历目录下所有文件,对文件中所有行进行更新处理

package cn.jerryhouse.util.file;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.UUID;

public abstract class LineUpdateProcessor extends FileProcessor {
	private long totalFileCount = 0;
	private long processedFileCount = 0;
	private String NEW_LINE = System.getProperty("line.separator");
	public void processFiles(File[] dirs) throws Exception {
		for (File file : dirs) {
			processFile(file);
		}
	}

	public void processFile(File file) throws Exception {
		if (file.isFile()) {
			if (isFileAccepted(file)) {
				handleFile(file);
			}
		} else {
			File[] files = file.listFiles();
			for (File fileInDir : files) {
				processFile(fileInDir);
			}
		}
	}

	protected boolean isFileAccepted(File file) throws Exception {
		return true;
	}

	protected void handleFile(File file)
	{
		try {
			BufferedReader br = new BufferedReader(new FileReader(file));
			File tmpFile = new File(tmpFilePath(file));
			BufferedWriter bw = new BufferedWriter(new FileWriter(tmpFile));
			String line;
			while((line=br.readLine())!=null)
			{
				String updatedLine = updateLine(file,line);
				bw.write(updatedLine+NEW_LINE);
			}
			br.close();
			bw.close();
			file.delete();
			tmpFile.renameTo(file);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private String tmpFilePath(File file)
	{
		String dir = file.getParent();
		String filePath = dir+""+getUniqFileName();
		return filePath;
	}
	
	private String getUniqFileName()
	{
		return UUID.randomUUID().toString();
	}
	protected abstract String updateLine(File file,String line);

	public long getTotalFileCount() {
		return totalFileCount;
	}

	public long getProcessedFileCount() {
		return processedFileCount;
	}
}