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
}
}
}