Java 读取文件夹和子文件夹中的文件
Java read files in folder and sub-folders
我正在制作一个将灰度图像更改为黑白图像的程序,该程序必须从文件夹和子文件夹中读取所有 .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);
}
}
}
非常感谢您帮助找出这背后的原因。
考虑先清理代码,然后查找错误:
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
对象作为它应该在的位置以目标的形式写入。该方法应确保第二个参数是一个目录,就像我在这里所做的那样——永远不要相信调用者!
我还没有测试过这段代码,还有一些其他的事情我会做不同的事情(比如异常处理),但我不希望结构有太大的不同,这样你就可以更容易地看到变化。
我在这里所做的是一种防御性编码。花时间使用奥卡姆剃刀,将代码减少到最低限度预先。选择在阅读方法时有意义的变量名称,而不是在顶部看起来不错的名称(并且不要害怕不断更改它们直到它易于阅读)。存在的错误将更容易找到,并且您将在漫长的 运行.
中节省大量时间
我正在制作一个将灰度图像更改为黑白图像的程序,该程序必须从文件夹和子文件夹中读取所有 .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);
}
}
}
非常感谢您帮助找出这背后的原因。
考虑先清理代码,然后查找错误:
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
对象作为它应该在的位置以目标的形式写入。该方法应确保第二个参数是一个目录,就像我在这里所做的那样——永远不要相信调用者!
我还没有测试过这段代码,还有一些其他的事情我会做不同的事情(比如异常处理),但我不希望结构有太大的不同,这样你就可以更容易地看到变化。
我在这里所做的是一种防御性编码。花时间使用奥卡姆剃刀,将代码减少到最低限度预先。选择在阅读方法时有意义的变量名称,而不是在顶部看起来不错的名称(并且不要害怕不断更改它们直到它易于阅读)。存在的错误将更容易找到,并且您将在漫长的 运行.
中节省大量时间