0

在下面的代码中,我解析了所有文件名,然后我试图检查数据库以查看它是否存在于其中。我在下面做错了什么?如果是这样,你能告诉我吗?

同样在执行命令中,我收到一条错误消息,提示无法将 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);
        }
    }
4

4 回答 4

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++;
        }
    }
于 2013-06-10T16:40:21.130 回答
0

listOfFiles特定于main()方法。要使其对类的其他部分可见,您必须将其声明为实例变量,例如:

public class FileGetName {
    public String fileName;
    public File[] listOfFiles;

您的方法doesFileExistinDB()应该返回boolean并测试是否rs返回另一个结果,以确保找到文件名。有关示例,请参阅Java ResultSet 如何检查是否有任何结果

于 2013-06-10T16:41:50.530 回答
0

2件事:

  1. 您的文件名未在查询中传递。你基本上是硬编码字符串“fileName”而不是你的fileName。

  2. 考虑返回一个布尔值以显示文件是否存在(如果 resultSet 至少有 1 个条目,则您的文件存在):

因此,您的方法变为:

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;
}
于 2013-06-10T16:43:54.717 回答
0

listofFiles在你的mainnot 在你的函数中声明execute()。你可以通过listofFiles向你的函数添加一个参数来传递一个。

public void execute(File[] listOfFiles){

}

但是你会遇到其他问题。在你的execute(). 当你在做:

if (listOfFiles[i].isFile())

变量 'i' 未初始化,但我认为您指的是:

for (int i = 0; i < listOfFiles.length; i++)

如果你想访问i,你需要打电话给executefor。您的方法执行应如下所示:

public void execute(File[] listOfFiles, int i){

}

编辑:一定要看看所有的答案,你的代码需要更多的修改,很多人已经指出了一些你应该改变的东西。

于 2013-06-10T16:45:25.387 回答