Java 如何向用户询问文件名,然后扫描文件夹中的特定类型,如果为true,则打开文件名;如果为true,则抛出错误

Java 如何向用户询问文件名,然后扫描文件夹中的特定类型,如果为true,则打开文件名;如果为true,则抛出错误,java,eclipse,file-io,input,Java,Eclipse,File Io,Input,因此,我一直在寻找解决问题的方法,但我只是找到了解决方案的一部分,我试图修改这些解决方案以满足我的需要,但我无法做到这一点 我正在使用此类检查文件类型 package parser; import java.io.File; import java.io.FilenameFilter; //import java.util.Scanner; public class FileFilter { public File[] finder(String dirName){

因此,我一直在寻找解决问题的方法,但我只是找到了解决方案的一部分,我试图修改这些解决方案以满足我的需要,但我无法做到这一点

我正在使用此类检查文件类型

package parser;

import java.io.File;
import java.io.FilenameFilter;
//import java.util.Scanner;

public class FileFilter {
    public File[] finder(String dirName){
        File dir = new File(dirName);
        //@SuppressWarnings("resource")
        //Scanner scanner = new Scanner(System.in);
        //System.out.println("Enter a file name: ");
        //System.out.flush();
        //String name = scanner.nextLine();

        return dir.listFiles(new FilenameFilter() { 
                 public boolean accept(File dir, String fileName) {
                     return fileName.endsWith(".xls");
                     }
                 });
    }

}
这是我尝试使用的主类的开头(我要求用户只键入文件名(不带扩展名)。我希望它在这里调用FileFilter类,并查看键入的文件名是否包含“xls”文件扩展名,如果不是,则抛出异常并终止,如果它签出,则继续

package parser;

import java.io.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.lang3.time.FastDateFormat;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.log4j.Logger;

public class ReadExcel {

    static final String ExcelFilePath = "D:\\eclipse\\workspace\\Assesment project\\";
    static final String RatesPropFilePath = "D:\\eclipse\\workspace\\Assesment project\\rates.properties";
    static final String TotalCostLogFilePath = "D:\\eclipse\\workspace\\Assesment project\\Total_Cost_Log.txt";
    static final int SheetNum = 0;
    static final int CellLookUp = 2;
    static final String AvoidText = "CC";
    static final Logger logger = Logger.getLogger(ReadExcel.class);

    @SuppressWarnings("static-access")
    public static void main(String[] args) {
        // Find all Excel files in folder
        /*FileFilter fileSearch = new FileFilter();
        System.out.println("Enter a file name: ");
        System.out.flush();
        String name = fileSearch.*/ // I'm stuck here, and I cannot find a way to fix it.. :S

        // Create an object of File class that points to the Excel file
        File excel = new File(ExcelFilePath);
编辑:为了消除混淆,我试图做的是:我试图让用户只输入文件名(减去扩展名)。然后当用户输入文件名时,它使用FileFilter类检查文件名(由用户输入)是否具有FileFilter定义的扩展名(即xls)…如果是,则继续程序(使用该文件)…如果不是,则抛出一个错误,然后终止。我希望这能让它更清楚:S

你在坚持什么

从用户处获取文件名(在控制台上)

这是一个它自己的问题,但幸运的是,在StackOverflow(如)和其他地方,使用其他方法(如)多次回答了这个问题。我个人更喜欢第二个

System.out.println("What is the name of the file: ");
Scanner in = new Scanner(System.in);
fileNameInQuestion = in.nextLine();
这已经存在于您的代码中,但在
FileFinder

验证文件是否存在

创建“过滤器”的实例,让它使用您已经使用的方法搜索给定的文件名,如果找不到,则抛出异常

//Create instance of your "Filter"
FileFilter fileSearch = new FileFilter();

/**
 * Get the name of and search for the filename in question
 * in the 'directoryToSearch'
 */
File[] file = fileSearch.finder(directoryToSearch);

//If no file is found then throw an Exception
if (file == null || file.length == 0)
{
  throw new Exception();
}
//...continue on...
请注意,如果参数
directoryToSearch
不是目录,或者如果没有匹配的文件,则
file
(请参阅)在这里可以是
null
。这两种情况都意味着查找文件时出现问题,因此如果其中一个参数为真,我将抛出异常,或者(
|
)另一个参数为真,则抛出异常

关于例外情况的注意事项

但是,这通常不被认为是异常的正确使用。主要是因为它们应该代表异常情况。在这种情况下,您更可能希望对文件名进行一些验证和反馈,而不是对无效输入执行异常,请参阅。
对于这个小案例,虽然它不是什么大问题,但需要注意的是。

看起来不太难,让我们看看(里面的评论!)

更新
根据你的评论:

问题是使用FileFilter类询问用户文件名,如果它具有该类定义的扩展名,则继续..如果没有,则抛出exception和break

嗯……要请求文件扩展名,您必须进行更多修改:

首先修改
FileFilter
以接受它:

public File[] finder(String dirName, String filename){
    File dir = new File(dirName);

    return dir.listFiles(new FilenameFilter() { 
        public boolean accept(File dir, String name) {
            // check for exact filename:
            return name.equals(filename + ".xls");
            // use both parameters to check various files with filename pattern
            return name.endsWith(".xls") && name.startsWith(filename);

        }
    });
}
其次,使用
扫描仪
获取扩展名,并在
文件过滤器
调用中使用它:

System.out.println("Enter file extension: ");
Scanner scanner = new Scanner(System.in);
String extension = scanner.nextLine();
最后,在
Main
方法中,使用此分机和文件夹进行呼叫:

public static void main(String[] args) {
    // create a FileFilter 
    FileFilter ff = new FileFilter();
    // ask for extension
    System.out.println("Enter file name: ");
    Scanner scanner = new Scanner(System.in);
    String filename= scanner.nextLine();
    // use finder method to get array of Files
    File[] files = ff.finder(yourFolder, filename);
    // if files is empty
    if (files == null || files.length == 0) {
          // throw the error
    } else {
        // iterate over all found files:
        for (File f : files) {
            // f is pointing to excel file
        }
    }
}

问题是,我想让用户输入一个文件名,然后检查该文件是否有FileFilter类定义的扩展名,如果有..继续..如果没有抛出异常并终止..这就是代码的功能。你认为它不做什么?哦,对不起..我还是Java新手,实际上从未做过任何输入om user。所以我在代码中没有看到任何关于输入的内容。但我猜是
fileSearch.finder
部分负责处理用户的输入?哦,这是您混淆的输入,问题似乎在于描述中的文件检查。来自Java的控制台输入完全是另一回事。我将在问题…是的,对不起,我想我把每个人都弄糊涂了..我编辑了OP,希望能让大家不那么困惑..@Fadi检查我的编辑…我误解了你…希望我的更新澄清我真的很抱歉,我想我把每个人都弄糊涂了!好吧,我想做的是..我想从用户那里输入的只是文件名(减去扩展名)。然后,当用户输入文件名时,它会使用FileFilter类检查文件名(由用户输入)是否具有FileFilter定义的扩展名(即xls)…如果是,则继续程序..如果不是,则抛出一个错误,然后终止。我希望这能让它更清楚..S我会将此添加到OP..@Fadi这就是我的编辑所做的…检查注释和解释,您将能够实现您需要的…如果我正确理解您的代码,则您正在向用户请求文件的扩展名…我不想这样做..我想向用户询问文件名..因此用户会输入类似“MyWorkbook”的内容,然后程序检查“MyWorkbook”是否具有扩展名xls(已在FileFilter类中定义)。如果扩展名以xls结尾(布尔值=真),则使用该文件..如果没有(布尔值=假)然后抛出一个错误消息并停止整个程序。非常感谢Jordi抽出时间!
public static void main(String[] args) {
    // create a FileFilter 
    FileFilter ff = new FileFilter();
    // ask for extension
    System.out.println("Enter file name: ");
    Scanner scanner = new Scanner(System.in);
    String filename= scanner.nextLine();
    // use finder method to get array of Files
    File[] files = ff.finder(yourFolder, filename);
    // if files is empty
    if (files == null || files.length == 0) {
          // throw the error
    } else {
        // iterate over all found files:
        for (File f : files) {
            // f is pointing to excel file
        }
    }
}