2012-02-13 79 views
0

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

是否有解析器可用来检查?

+0

我认为没有元数据可用?或者你可以有不同的文件扩展名为不同的类型? – 2012-02-13 16:32:39

+0

没有元数据,正确。我不想依赖扩展,经验表明它们不可靠 – JAM 2012-02-13 16:33:28

回答

1

如果你的程序的要求是,输入文件是格式良好的,而不是混合型,那么我会建议更换您的JSON和XML impls下列要求:

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

  2. XML - 查找文件头;格式良好的XML文件在这个头文件之前甚至没有空间;它必须立即出现。再次,没有理由尝试并摄取整个事物来捕捉异常。

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

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

总而言之,如果您的要求是明确定义的,那么做廉价/快速检查就是这里的方法。如果你需要一个JSON文件是所有的JSON,并且你遇到的第一个字符是'{',那么我会说这是一个JSON文件,而不是EMPTY,XML或PROPERTIES(再次,因为我不包含SCRIPT知道格式)。

然后你就可以倒转输入流,并把它给你解析图书馆看书(这是PushbackInputStreams可以来方便)

+1

*“格式良好的XML文件甚至在此标题之前甚至没有空格”* ...注意它是有效的和常见的SO上的常见问题的来源)使用UTF-8编码接收XML并以BOM标记开始。在这种情况下,您有3个字节(BOM需要3个字节以UTF-8编码)** BEFORE ** XML标头。 BOM不是XML头的一部分:你可以在UTF-8编码但不是XML的文件中使用UTF-8 BOM ......这是常见的混淆之处,因为人们看着第一个字节并说:*“哦,这不是一个XML标题”*并错过文件; ) – TacticalCoder 2012-02-13 17:00:19

+0

@ user988052欣赏洞察!我没有意识到这一点,并且肯定它有一天会钉住我。 – 2012-02-13 17:02:32

+0

属性语法允许更多,请参见[here](http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html)。特别是注释行('#comment')或'键值',即任何分隔符,不仅是'='。事实上,一个文件可以不是一个有效的.properties文件吗?即使减少到典型的.properties文件,注释行可能是典型的第一行(它在我的文件中)。 – 2012-02-13 19:57:49

0

Properties#load用于解析属性文件。它不会做任何不同于阅读每行以查看它是否符合语法(有一点比只有Key=Value多一点)。如果格式无效,则会引发异常。

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

+0

属性#如果文件不是K = V格式,则load#不会引发异常。我希望它能做到,但它不会 – JAM 2012-02-13 16:57:57

+0

你是对的,它只是将这些行读作没有价值的键。 – 2012-02-13 19:51:57

2

你可以试试这个整洁的图书馆:WazFormat

+0

绝对可怕的图书馆,但没有我在找什么。 +1虽然 – JAM 2012-02-13 16:54:02

+0

很好的参考我很抱歉,它真的不能'发现shell sript和.properties。当我尝试时,我感到不知所措,所以我只是假设:) – kostja 2012-02-13 19:08:32

0

对于shell脚本: 那岂不是足够检查是否指定了壳的家当后的文字,例如

!/斌/庆典是壳

!/ bin/sh的是外壳

。 。 。

!在/ usr/bin中/红宝石没有外壳

!在/ usr/bin中/ perl的不外壳

针对脚本语言的其他轮次 。 。

同为XML,它应该有一个DOCTYPE线像

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