【问题标题】:Java read files in folder and sub-foldersJava 读取文件夹和子文件夹中的文件
【发布时间】:2015-05-04 18:10:58
【问题描述】:

我正在制作一个将灰度图像更改为黑白图像的程序,该程序必须从文件夹和子文件夹中读取所有 .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);
    }
}

}

感谢您帮助找出这背后的原因。

【问题讨论】:

    标签: java file-io


    【解决方案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);
            }
        }
    }
    

    你有很多不必要的Files 和混合字符串和Files 当File 会做。

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

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

    我在这里所做的是一种防御性编码。花时间了解奥卡姆剃刀原理,预先将代码降到最低限度。选择在阅读方法时有意义的变量名称​​,而不是顶部看起来不错的名称(不要害怕不断更改它们,直到它易于阅读)。存在的错误会更容易找到,从长远来看,您将节省大量时间。

    【讨论】:

    • 感谢答案和建议,我知道代码很糟糕。顺便说一句,我发现了这个错误,我忘记在更改颜色之前检查文件是否为 png,因此读取了隐藏文件。
    • 没有人开始编写完美的代码,不用担心!玩得开心!
    最近更新 更多