1. File类的list功能递归遍历filedir
2. 遍历文件使用文件过滤器获得目录中有几种不同的文件格式以及文件的个数
结果存储到map集合中
{java:4,txt:2,doc:8}
3.根据map 集合的 key 创建目录 例如java 目录 并把文件移动到对应的目录中
复制(字节流进行文件复制)
4. 定义一个方法 把map 集合中文件和文件记录数据写入到一个文件中 要求按照从高到低写入到文件
对map 集合的value 进行排序
filestatus:
文件类型 个数
java 8
doc 6
一、遍历文件,并统计文件内后缀名不同的文件的个数
分析:首先需要用FileFilter过滤器删选得到我们所需要的文件(如后缀名为doc,txt,jpg等)
由于FileFilter是个接口,所以我们要写一个类去实现它,代码如下:
class JavaFilter implements FileFilter{
//定义一个属性 map 存储记录文件
private Map<String,Integer> map ;
public JavaFilter(Map<String, Integer> map) {
this.map = map;
}
@Override
public boolean accept(File pathname) {
//递归遍历文件
mylistFileToMap(pathname,map);
return true;
}
private void mylistFileToMap(File filterFile,Map<String,Integer> fileMap){
//获得文件扩展名
if (filterFile.isFile()){
String name = filterFile.getName();
String extendName = name.substring(name.lastIndexOf(".")+1);
//判断 map 集合存在这个扩展名 计数器+1 不存在 设置为1
if (fileMap.containsKey(extendName)){
fileMap.put(extendName,fileMap.get(extendName)+1);
}else {
fileMap.put(extendName,1);
}
}else if (filterFile.isDirectory()){
//递归列举目录中的文件
File[] files = filterFile.listFiles();
for (File file : files) {
mylistFileToMap(file,fileMap);
}
}
}
}
二、文件复制,根据map 集合的 key 创建目录 例如java 目录 并把文件移动到对应的目录中
复制(字节流进行文件复制)
分析:
/* * 1. 遍历Map ,根据key 去原始目录中查找对应的文件存储到一个文件集合中 * Map<String,List<File>> * 2. 遍历map 集合 根据key 创建目录 mkdirs() * 把对应的集合 写一个文件复制的方法 复制到对应目录 字节流 */
public static void xxxFiles( Map<String,Integer> fileMap,File file) throws IOException {
Map<String,List<File>> listMap = new HashMap<>();//用来输出不同文件后缀名的集合 [doc,...doc]
Set<String> setMap = fileMap.keySet();
List<File> fileList = new ArrayList<>();//
String[] list = file.list();
for (String key : setMap) {//遍历file文件和map集合的key比较
for (String lastName : list) {//遍历把内容写进list集合+lastname==helloword.txt
String substring = lastName.substring(lastName.indexOf(".") + 1);
if (substring.equals(key)){
File f = new File(lastName);//f=R-C1.jpg
fileList.add(f);
ArrayList<File> copy = new ArrayList<>(fileList);
listMap.put(key,copy);
}
}
fileList.clear();
}
Set<Map.Entry<String,List<File>>> fileSet = listMap.entrySet();
for (Map.Entry<String, List<File>> key : fileSet) {
System.out.println("key:"+ key.getKey());
for (File temp : key.getValue()) {
File f = new File(file,key+"\\"+temp.getName());
if (!f.exists()){
createNewFile(key.getKey(),temp.getName(),list);//list是文件的数组
}
else System.out.println("文件已存在!");
}
}
}
private static void createNewFile(String key,String fileName,String[] list) throws IOException {
File f = new File("F:\\ioTest\\"+key);
if (!f.exists()) {
f.mkdirs();
File path1 = new File("F:\\ioTest\\"+key+"\\"+fileName);// ioTest\jpg\c1.jpg
for (String temp : list) {
File path2 = new File("F:\\FileTest"+"\\"+temp);// FileTest\c1.jpg
if (temp.equals(fileName)){
copy(path2.getPath(),path1.getPath());
}
}
}
}
//复制的方法有很多种,我采用的是缓冲字节流,一次复制一个字节数组
public static void copy(String src,String des){
try {
BufferedInputStream bfis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(des));
int len ;
byte[] bytes = new byte[4096*1024];
while ((len=bfis.read(bytes))!=-1) {
bos.write(bytes,0,len);
}
bfis.close();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
三、排序
分析:
// treeMap 自动实现 map集合的key排序
// 但我们这里要求的是map 集合的value 排序
// 排序 Collections 本质就是对map 中的entry 排序
public static void listDir(File file) throws IOException {
Map<String,Integer> fileMap = new HashMap<>();
file.listFiles(new JavaFilter(fileMap));
// System.out.println("file:"+Arrays.toString(files));
System.out.println("统计结果: "+fileMap);
//文件复制
xxxFiles(fileMap,file);
Set<Map.Entry<String,Integer>> entries = fileMap.entrySet();
// 把set 转换为list
List<Map.Entry<String,Integer>> entryList = new ArrayList<>();
for (Map.Entry<String, Integer> entry : entries) {
entryList.add(entry);
}
System.out.println("排序前:"+entries);
//排序
Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> entry1, Map.Entry<String, Integer> entry2) {
return entry1.getValue()-entry2.getValue();
}
});
System.out.println("排序后:"+entryList);
//集合写入文件BufferWriter
File fileWriter = new File("src\\week03\\day03\\result\\result.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(fileWriter));
bw.write("类型\t个数");
bw.newLine();
for (Map.Entry<String, Integer> stringIntegerEntry : entryList) {
bw.write(stringIntegerEntry.getKey()+"\t\t"+stringIntegerEntry.getValue());
bw.newLine();
}
bw.close();
}
四、主方法
public static void main(String[] args) throws IOException {
listDir(new File("F:\\FileTest"));
}
五、结果
下图中画圆圈的便是所复制的文件夹了。