如何在Java中使用’Startswith’变量来查找文件

我正在尝试根据每次迭代从Excel工作表中提取的前8个数字查找文件.每当我使用下面的代码时,我都会收到错误消息“在封闭范围内定义的局部变量CaseID必须是最终的或实际上是最终的”.我还是个新手,所以即使听起来很简单,也不确定如何解决这个问题.该问题发生在代码底部的caseID变量处.

  package Chrome;
    //CHROME
    import java.io.File;
    import java.io.FileFilter;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.FilenameFilter;

    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.DataFormatter;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.chrome.ChromeOptions;


    public class ValidateInput {

    public static void main(String[] args) throws Throwable {
    // TODO Auto-generated method stub

    // String filePath=System.getProperty("user.dir")+"\\UP.xlsx";
    //File src = new File(filePath);    
    //System.out.println(filePath);
    File src = new File("C:\\Users\\Z246379\\Documents\\TestDataFolder\\ValidateInput.xlsx");          
    FileInputStream fis = new FileInputStream(src);        



    XSSFWorkbook wb = new XSSFWorkbook(fis);        
    XSSFSheet Sheet1 = wb.getSheetAt(0);
    int i1 = 2;
    //Username
    String data0 = Sheet1.getRow(2).getCell(0).getStringCellValue();
    //Password    
    String data01 = Sheet1.getRow(2).getCell(1).getStringCellValue();
    //Case ID
    String caseID = Sheet1.getRow(i1).getCell(2).getStringCellValue();
    // Description
   String Desc = Sheet1.getRow(2).getCell(3).getStringCellValue();
   //Internal Claim File
   String ICF = Sheet1.getRow(1).getCell(4).getStringCellValue();
    String CRPT = Sheet1.getRow(1).getCell(5).getStringCellValue();

    // final String caseID1 = caseID1;




    //Chrome driver code

     System.out.println("Called openBrowser");
     String exePath = System.getProperty("user.dir")+"\\chromedriver.exe";
     System.setProperty("webdriver.chrome.driver", exePath);
     ChromeOptions options = new ChromeOptions();
     options.setExperimentalOption("useAutomationExtension", false);
     options.addArguments("start-maximized");
     options.addArguments("--no-sandbox");
     options.addArguments("--disable-extensions-except");
     options.addArguments("disable-extensions");
     //options.setExperimentalOption("useAutomationExtension", false); 
     WebDriver driver = new ChromeDriver(options);
     driver.get("https://client.abc.com");


     //Logging in       
     driver.findElement(By.xpath("//input[@id='userid']")).sendKeys(data0);
     driver.findElement(By.xpath("//body[@class='no-nav']/div[@id='wrapper']/header[@class='header']/div[@class='container']/div[@class='menu']/div[@class='drop']/div[@class='login-form']/form[@method='POST']/div[2]/input[1]")).sendKeys(data01);
     driver.findElement(By.xpath("//input[@value='Sign In']")).click();
     Thread.sleep(2000);
     //Navigate to Validate Input
     driver.findElement(By.xpath("//span[@class='wpsNavLevel2'][contains(text(),'EZ-Test')]")).click();
     Thread.sleep(3000);
     driver.get("https://ezt.abc.com/Test/inputFiles/selectValidateInput/selectValidateInput.xhtml");

     while (caseID != null)
          {

      caseID = Sheet1.getRow(i1).getCell(2).getStringCellValue();
      //Input Validate Input stuff

      driver.findElement(By.xpath("//input[@id='mainForm:caseId']")).sendKeys(caseID);
    driver.findElement(By.xpath("//input[@id='mainForm:testBedDesc']")).sendKeys(Desc);
      driver.findElement(By.xpath("//select[@id='mainForm:customRptOptions']")).sendKeys(ICF);
     driver.findElement(By.xpath("//span[@id='mainForm:customReportLabel']")).click();




      File dir = new File("C:\\Users\\Z333379\\Documents\\Test beds");
      FilenameFilter filter = new FilenameFilter() {
      public boolean accept (File dir, String name) { 
       return name.startsWith(caseID); //this is where i get the error. its not letting me make case ID a variable. but i really need the starts with stuff
       } 
     }; 
     String[] children = dir.list(filter);
     if (children == null) {
        System.out.println("Either dir does not exist or is not a directory"); 
     } else { 
       for (int i=0; i< children.length; i++) {
       String filename = children[i];
       System.out.println(filename);
            driver.findElement(By.xpath("//input[@id='mainForm:comprehensive']")).sendKeys("C:\\Users\\Z246379\\Documents\\Test beds\\" + filename);
        } 
     } 

     driver.findElement(By.xpath("//button[@id='mainForm:reset']")).click();


     i1=i1+1;
          }

      }
    }

解决方法:

这里:

FilenameFilter filter = new FilenameFilter() {
    public boolean accept (File dir, String name) { 
        return name.startsWith(caseID);
    } 
};

您不能在内部局部类的定义中使用可变变量.这就是为什么您会收到错误编译器.

创建一个临时变量并在其中分配caseID的值,在内部本地类中使用此变量:

final String localCaseID = caseID;
FilenameFilter filter = new FilenameFilter() {
    public boolean accept (File dir, String name) { 
        return name.startsWith(localCaseID);
    } 
};
上一篇:数组-简单


下一篇:ES6字符串包含方法