在下面的代码中,我解析了所有文件名,然后使用它,我正在尝试检查 数据库,看它是否存在。我下面做错了什么?如果是的话,你能告诉我吗?
同样在执行命令中,我收到一条错误,说listofFiles无法解析为变量。
public class FileGetName {
public String fileName;
public static void main(String[] args) {
File folder = new File("C");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
System.out.println(listOfFiles[i].getName());
} else if (listOfFiles[i].isDirectory()) {
System.out.println("Directory " + listOfFiles[i].getName());
}
}
}
public void doesFileExistinDB(String fileName) {
PreparedStatement pst = null;
Connection conn = null;
ResultSet rs= null;
try {
conn = DBConnect.getInstance().dbOracleConnect();
String sql= "select * from PO_Parent_List where" +
" po_number in (fileName)";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
}
catch (Exception e) {
System.out.println(e);
}
}
public void execute() {
if (listOfFiles[i].isFile())
{
String fileName = listOfFiles[i].getName();
System.out.println(fileName);
doesFileExistInDb(fileName);
}
}
答案 0 :(得分:2)
您需要在listOfFiles
方法中传递 public void execute()
,如:
public void execute(File[] listOfFiles){
}
这就是为什么你得到编译错误,因为listOfFiles
无法解析为变量。
或您需要将变量listOfFiles
声明为班级。
编辑(无法理解您调用执行的位置)
int i = 0;//Declare i to class level.
public void execute(File[] listOfFiles) {
if (listOfFiles[i].isFile())
{
String fileName = listOfFiles[i].getName();
System.out.println(fileName);
doesFileExistInDb(fileName);
i++;
}
}
答案 1 :(得分:0)
listOfFiles
特定于main()
方法。要使其对类的其他部分可见,必须将其声明为实例变量,例如:
public class FileGetName {
public String fileName;
public File[] listOfFiles;
您的方法doesFileExistinDB()
应该返回boolean
并测试rs
是否还会返回一个结果,以确保找到文件名。有关示例,请参阅Java ResultSet how to check if there are any results。
答案 2 :(得分:0)
2件事:
您的fileName未在查询中传递。你基本上硬编码String&#34; fileName&#34;而不是你的fileName。
考虑返回一个布尔值,以显示文件是否存在(如果resultSet至少有一个条目,您的文件存在):
因此,您的方法变为:
public boolean doesFileExistinDB(String fileName) {
PreparedStatement pst = null;
Connection conn = null;
ResultSet rs= null;
try {
conn = DBConnect.getInstance().dbOracleConnect();
String sql= "select * from PO_Parent_List where" +
" po_number in (?)";
pst = conn.prepareStatement(sql);
pst.setString(1, fileName);
rs = pst.executeQuery();
if (rs.next) {
//You have data!
return true;
}
}
catch (Exception e) {
System.out.println(e);
}
return false;
}
答案 3 :(得分:0)
listofFiles
在您的main
中声明,而不在您的函数execute()
中。您可以通过向函数添加参数来传递listofFiles
。
public void execute(File[] listOfFiles){
}
但你会遇到别人的问题。在execute()
中。当你在做的时候:
if (listOfFiles[i].isFile())
变量'i'未初始化,但我认为您正在参考:
for (int i = 0; i < listOfFiles.length; i++)
如果您想访问i
,则需要在execute
中致电for
。您的方法执行应该如下所示:
public void execute(File[] listOfFiles, int i){
}
编辑:请务必查看所有答案,您的代码需要进行更多修改,而且很多人都指出了您应该更改的内容。