如何有效地确定文件类型?

时间:2012-02-13 16:28:10

标签: java

我正在处理的程序查看各种ASCII文本文件并进行一些处理。为了知道如何处理事情,需要知道文件是否

- IS_EMPTY         // done
- IS_JSON          // done via parsing, using gson
- IS_XML           // done via parsing, using dom4j
- IS_PROPERTIES    
- IS_SCRIPT

我想知道是否有一种有效的方法来确定文件是否属于类型属性而不读取每一行以查看它是否包含Key=Value对?

此外,是否有一种有效的方法来确定文件是否是shell脚本?

是否有任何解析器可供检查?

5 个答案:

答案 0 :(得分:2)

您可以尝试这个整洁的库:WazFormat

答案 1 :(得分:1)

如果你的程序的要求是输入文件格式良好而不是混合类型,那么我建议用以下内容替换你的JSON和XML impls:

  1. JSON - 只需查找一个开头'{'作为文件中的第一个字符;这是任何其他文件的无效格式(可能是脚本,具体取决于您的格式)。如果你发现'{'作为第一个字符,它是一个JSON。这节省了使用GSON处理整个文件。

  2. XML - 查找文件头;格式良好的XML文件在此标题之前甚至不能有空格;它必须立即出现。同样,没有理由尝试摄取整个事物只是为了捕获异常。

  3. 属性 - 同样,我会检查第一行并确保它具有= \ n格式。如果他们这样做,你很高兴。

  4. 脚本 - 我不确定您的脚本语言的格式,但是您明白了。

  5. 总而言之,如果你的要求是明确定义的话,做便宜/快速的检查就是去这里的方法。如果你需要一个JSON文件是所有JSON,你遇到的第一个字符是'{'然后我会说这是一个JSON文件,而不是EMPTY,XML或PROPERTIES(再次,不包括SCRIPT,因为我没有知道格式。)

    然后你可以回滚输入流并将其提供给你的解析库来阅读(这是PushbackInputStreams可以派上用场的地方)

答案 2 :(得分:0)

Properties#load用于解析属性文件。它与读取每一行以查看它是否符合语法没有任何不同(只有Key=Value)。如果格式无效,则抛出异常。

Shell脚本?不要认为它是可能的,因为它们可以是任何语言或不同的贝壳。我会检查shebang的第一行。

答案 3 :(得分:0)

对于shell脚本: 在Shebang之后检查文本是否指定shell是不够的,例如

!/ bin / bash是shell

!/ bin / sh是shell

。 。

!/ usr / bin / ruby​​不是shell

!/ usr / bin / perl不是shell

另外围绕脚本语言 。

对于XML,它应该具有类似

的doctype行

<?xml version="1.0" standalone="yes" ?>

答案 4 :(得分:0)

此博客文章包含指向用于识别文件类型的几个库的链接: http://stanlearnslinux.blogspot.com/2011/08/libmagic-like-java-packages.html

jmimemagic看起来会像你想要的那样(包括shell脚本): http://sourceforge.net/projects/jmimemagic/