import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;
/**
* list the files in a folder,and statistic files by type
*
* @author eric
* @date 2011-2-14 下午05:12:18
*/
public class FileStatistic {
/**
* list & statistic files in folder
*
* @param folderPath path of folder to statistic
* @param outputPath path of result file
* @throws IOException
*/
public static void statisticFile(String folderPath, String outputPath) throws IOException {
File folder = new File(folderPath); // folder to statistic
File outputFile = new File(outputPath); // output file
if (!outputFile.exists()) { // create output file if not exists
outputFile.createNewFile();
}
FileWriter fw = new FileWriter(outputFile);
if (!folder.exists()) { // folder not exists
fw.write("folder not exists!");
fw.flush();
return;
} else {
fw.write("'" + folderPath + "' statistic result - " + new Date() + "\n");
}
List<String> filenameList = new ArrayList<String>();
TreeMap<String, Integer> typecountMap = new TreeMap<String, Integer>();
List<File> fList = getFilesRecursive(folder);
String keyFolder = "folder"; // key for folder
typecountMap.put(keyFolder, 0);
for (int i = 0; i < fList.size(); i++) {
File _file = fList.get(i);
String _filename = _file.getName();
filenameList.add(_filename); // store filename
if (_file.isDirectory()) { // folder
typecountMap.put(keyFolder, typecountMap.get(keyFolder) + 1);
} else { // file
String suf = getSuf(_filename);
// statistic file type
if (typecountMap.get(suf) == null) {
typecountMap.put(suf, 1);
} else {
typecountMap.put(suf, typecountMap.get(suf) + 1);
}
}
}
fw.append("\nfile list:\n");
for (Iterator<String> it = filenameList.iterator(); it.hasNext();) {
fw.append("\t" + it.next() + "\n");
}
fw.append("\nfile type static:\n");
for (Iterator<String> it = typecountMap.keySet().iterator(); it.hasNext();) {
String _key = (String) it.next();
fw.append("\t" + _key + "\t\t" + typecountMap.get(_key) + "\n");
}
fw.flush();
fw.close();
}
/**
* get suffix of filename
*
* @param filename
* @return
*/
public static String getSuf(String filename) {
int lastIndex = filename.lastIndexOf(".");
if (lastIndex < 0) {
return "";
} else {
return filename.substring(lastIndex);
}
}
/**
* 获得 某目录下所有的子文件列表
*
* @param root
* @return
*/
private static List<File> getFilesRecursive(File root) {
List<File> fileList = new ArrayList<File>();
List<File> tmpFolderList = Arrays.asList(root);
while (!tmpFolderList.isEmpty()) {
tmpFolderList = getFilesRecursiveInner(fileList, tmpFolderList);
}
return fileList;
}
/**
* 获得 将指定目录list 下 直接 子目录/文件 放入 list,并将 直接子目录 放入 另一个 list 返回
*
* @param fileList
* @param folderList
* @return
*/
private static List<File> getFilesRecursiveInner(List<File> fileList, List<File> folderList) {
List<File> subFolderList = new ArrayList<File>();
for (Iterator<File> it = folderList.iterator(); it.hasNext();) {
File _folder = (File) it.next();
File[] _files = _folder.listFiles();
if (_files != null) {
for (int i = 0; i < _files.length; i++) {
File _file = _files[i];
fileList.add(_file);
if (_file.isDirectory()) {
subFolderList.add(_file);
}
}
}
}
return subFolderList;
}
public static void main(String[] args) throws IOException {
statisticFile("/usr/lib", "/home/eric/filestatistic.txt");
}
}
分享到:
相关推荐
Java实现统计一个文本文件中每一行字符串出现的次数,Java实现统计一个文本文件中每一行字符串出现的次数
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...
基于Java平台的Ldap目录和数据读取工具。
代码行统计工具V2.0 <br>可以统计任何文本文件类型,可以自定义要统计的类型,默认情况下只统计.cs,.java,.cpp,.c类型的文件 <br>V2.0新增功能 +单击统计信息列表头可以实现自动排序 +新增分类文件...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
程序员策略并将内容保存在文件中以便处理,然后通过 String 类处理内容以计算单词。程序员可以创建不同的选择,以使项目更具创造性和吸引力。您还可以使用格式化的 Java API 来格式化客户端交付的内容。
一、数据库工具类 1、com.baijob.commonTools.db.ds C3p0Ds 和 DruidDs分别是两种连接池的实现,依赖于数据库配置文件,配置文件的样例参考config/db-example.setting 使用时将db-example.setting复制于${...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
可以比较连个文件内容哪行有变化,并用颜色标示出来,很方便
提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...
提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...
提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...
提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...
提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...
提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...
提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...
提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...
提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...
提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...
7.4 实验3 Java的常用工具类 第8章 字符串 8.1 预备知识 8.2 实验1 一个String类的简单应用 8.3 实验2 单词替换和统计问题 8.4 实验3 字符串的比较和查找最长子串 8.5 实验4 单词逆向输出问题 8.6 实验5 ISBN...