我通常会找到解决问题的方法,但是这次我似乎找不到。
我正在使用JavaCC为自设计语言编写编译器。在我简单地使用System.in读取文件之前,因此我知道我的编译器可以使用任何扩展名的任何基于文本的文件。
此项目只能打开带有自定义扩展名(.bait)的文件。根据我的研究,Java中有很多方法来获取文件的扩展名,但是它们都需要完整的路径。我的编译器应该通过终端(CMD)从用户磁盘的任何位置运行,因此我认为Java的选项没有用。
问题:如果给定的文件扩展名不是.bait,我该如何过滤给定文件的扩展名?
我使用的原始代码非常简单:
hook analizador = new hook (System.in);
analizador.RunLexer();
'hook'是类,RunLexer()是词法分析的一种方法。该代码允许分析任何基于文本的代码。对于扩展规则,我考虑使用* .bait正则表达式,如下所示:
hook analizador = new hook (new FileInputStream("*.bait"));
analizador.codigo();
和
InputStream input = new FileInputStream("*.bait");
hook analizador = new hook (input);
到目前为止,没有运气。有人可以指导我吗?答案的解释将不胜感激。
编辑:感谢sepp2k和MeetTitan。
System.in不是一个选项,因此可以将文件名(用作参数)用于所有需要的验证:
String arc = args[0];
if(arc.endsWith(".bait")){ //checks file extention
File src = new File(arc); //created just to use exists()
if(src.exists()){
FileReader fr = new FileReader(arc); //used instead of System.in
hook analizador = new hook(fr);
} else System.out.println("File not found");
} else System.out.println("Invalid filetype");
关于使用程序的方式,请使用终端(CMD)
java hook file.bait
此代码不允许用户按预期从钩子目录中运行.bait文件,因此即使在不同位置有多个文件副本,它也是安全的。
希望对某人有用,再次感谢sepp2k和MeetTitan!
答案 0 :(得分:0)
你为什么不能做这样的事情?
//this method takes a String and returns a substring containing the characters between the last occurrence of '.' and the end of the String
//For example, getExtension("test/your.file.bait"); will return "bait".
public static String getExtension(String fileNameOrPath) {
return fileNameOrPath.substring(fileNameOrPath.lastIndexOf('.')+1);
}
//this method compares equality of "bait" and the returned extension from our other method
public static boolean isBait(String fileNameOrPath) {
return "bait".equals(getExtension(fileNameOrPath));
}
您可以在任何相对或绝对路径或文件名上使用isBait(String)
。
您还可以简单地利用String.endsWith(String)
。
像这样:
public static boolean isBait(String str) {
return str.endsWith(".bait");
}
编辑
要获得具有特定扩展名的文件夹中所有文件的列表,请使用带有FilenameFilter
的{{1}}
像这样:
File.listFiles()
编辑以遍历每个子文件夹并仅获取某些文件:
File dir = new File("path/to/folder");
File[] baitFiles = dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".bait");
}
});