排除基于Java的编译器的文件扩展名吗?

时间:2018-11-08 01:30:49

标签: java parsing file-extension lexical-analysis javacc

我通常会找到解决问题的方法,但是这次我似乎找不到。

我正在使用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!

1 个答案:

答案 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");
    }
});