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

Java 如何有效地确定文件类型?,java,Java,我正在使用的程序查看各种ASCII文本文件并进行一些处理。为了知道如何处理事情,需要知道文件是否 - IS_EMPTY // done - IS_JSON // done via parsing, using gson - IS_XML // done via parsing, using dom4j - IS_PROPERTIES - IS_SCRIPT 我想知道是否有一种有效的方法来确定文件是否属于类型属性,而不必读取每一行来查

我正在使用的程序查看各种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脚本

是否有任何解析器可用于检查此问题?

属性#加载用于解析属性文件的
。除了阅读每一行,看看它是否符合语法(除了
Key=Value
)之外,它没有什么不同。如果格式无效,则引发异常

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

属性#加载
以解析属性文件。除了阅读每一行,看看它是否符合语法(除了
Key=Value
)之外,它没有什么不同。如果格式无效,则引发异常


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

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

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

获取shell脚本: 检查Shebang之后的文本是否指定了shell,例如

!/bin/bash是shell !/bin/sh是shell 。 .

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

否则,脚本语言将被淘汰 .

对于XML也是一样,它应该有一个doctype行,如

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

!/bin/bash是shell !/bin/sh是shell 。 .

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

否则,脚本语言将被淘汰 .

对于XML也是一样,它应该有一个doctype行,如


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

  • JSON-只需在文件的第一个字符中查找一个开头“{”,这对于任何其他文件来说都是无效的格式(根据您的格式可能会有脚本除外)。如果您发现“{”是第一个字符,则它是一个JSON。这节省了使用GSON处理整个文件的时间

  • XML—查找文件头;格式良好的XML文件在此头之前甚至不能有空间;它必须立即显示。同样,没有理由仅仅为了捕获异常而尝试和接收整个文件

  • 属性-同样,我会检查第一行并确保它的格式为=\n。如果是这样,您就可以开始了

  • 脚本-我不确定你的脚本语言的格式,但是你知道了

  • 总之,如果你要求一个JSON文件都是JSON,并且在读取文件时遇到的第一个字符是“{”,那么我会说这是一个JSON文件,而不是空的、XML或属性(同样,不包括脚本,因为我不知道格式)


    然后,您可以倒带输入流并将其交给您的解析库读取(这是方便的地方)

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

  • JSON-只需在文件的第一个字符中查找一个开头“{”,这对于任何其他文件来说都是无效的格式(根据您的格式可能会有脚本除外)。如果您发现“{”是第一个字符,则它是一个JSON。这节省了使用GSON处理整个文件的时间

  • XML—查找文件头;格式良好的XML文件在此头之前甚至不能有空间;它必须立即显示。同样,没有理由仅仅为了捕获异常而尝试和接收整个文件

  • 属性-同样,我会检查第一行并确保它的格式为=\n。如果是这样,您就可以开始了

  • 脚本-我不确定你的脚本语言的格式,但是你知道了

  • 总之,如果你要求一个JSON文件都是JSON,并且在读取文件时遇到的第一个字符是“{”,那么我会说这是一个JSON文件,而不是空的、XML或属性(同样,不包括脚本,因为我不知道格式)


    然后,您可以倒带输入流并将其交给您的解析库阅读(这是方便的地方)

    这篇博文包含一些库的链接,用于识别文件类型:

    jmimemagic看起来可以实现您想要的功能(包括shell脚本):

    这篇博文包含几个用于识别文件类型的库的链接:

    jmimemagic看起来可以实现您想要的功能(包括shell脚本):

    我假设没有元数据可用?或者不同类型的文件可以有不同的文件扩展名?没有元数据,正确。我不想依赖扩展名,经验表明它们不可靠。我假设没有元数据可用?或者不同类型的文件可以有不同的文件扩展名?没有元数据,正确。我没有想要依赖扩展,经验表明它们是不可靠的非常棒的库,但没有我要找的库。+1非常好的参考尽管很抱歉,它真的无法发现shell sript和.properties。当我尝试时,我对它能做的事情感到不知所措,所以我只是假设:)肯定是非常棒的库,但n我没有我要找的东西。尽管我是