Java读取文件夹和子文件夹中的文件

时间:2015-05-04 18:10:58

标签: java file-io

我正在制作一个将灰度图像更改为黑白图像的程序,程序必须从文件夹和子文件夹中读取所有.png文件,并在编辑后保存到新目录。每件事都按预期工作,但我做了一些更改,程序现在只从第一个文件夹或带有图像的子文件夹中读取文件。

public class FindFiles {
public void find(String dir, String finDir){ 
    try {
        File folder = new File(dir);
        File[] listOfFiles = folder.listFiles();

        ChangeColor change = new ChangeColor();

        for(int i = 0; i < listOfFiles.length; i++) {
            if (listOfFiles[i].isFile()) {
                change.ChangeC(dir, finDir, listOfFiles[i].getName());
            } else if (listOfFiles[i].isDirectory()) {
                File f = new File(finDir+"/"+listOfFiles[i].getName());
                if (!f.isDirectory()) {
                    new File(finDir+"/"+listOfFiles[i].getName()).mkdirs();
                }
                find(dir+"/"+listOfFiles[i].getName(),finDir+"/"+listOfFiles[i].getName());
            }
        }   
    } catch (IOException ex) {
        Logger.getLogger(FindFiles.class.getName()).log(Level.SEVERE, null, ex);
    }
}

}

我很感激你的帮助,找出背后的原因。

1 个答案:

答案 0 :(得分:1)

首先考虑清理代码,然后查找错误:

public class FindFiles {
    public void find(File src, File target) {
        assert(src.isDirectory() && target.isDirectory());
        try {
            File[] fileList = src.listFiles();

            ChangeColor change = new ChangeColor();

            for (File file : fileList) {
                if (file.isFile()) {
                    change.ChangeC(file, target);
                } else if (file.isDirectory()) {
                    // create the File object for the directory name
                    File newDir = new File(target, file.getName());
                    newDir.mkdir();
                    find(file, newDir);
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(FindFiles.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

File会产生很多不必要的File代,并混合字符串和File

您需要更改ChangeColor.changeC()的签名以接受需要从源目录转换的File对象和File对象,以便将其写入以目标的形式。该方法应该确保第二个参数是我在这里所做的目录 - 永远不要相信调用者!

我没有测试过这段代码,还有其他一些我会做的事情(例如异常处理),但我不希望结构太不同,所以你可以更容易地看到变化。

我在这里做的是一种防御性编码。花时间与Occam的Razor一起将代码降到最低预先。选择在阅读方法时有意义的变量名,而不是在顶部看起来很好的名称(并且不要害怕继续更改它们直到它容易读取)。存在的错误将更加清晰,从长远来看,您将节省大量时间。