繁体   English   中英

用Java解析混合数据

[英]Parsing mixed data with Java

有点像Java菜鸟,已经在大约6种不同的流+扫描器之间切换了,但是仍然找不到一种方法来完成我需要做的所有事情。 我试图实现一种算法来解析遵循某种语法的文件。 在很多地方,我需要查看下一个字符以查看它是括号还是逗号,还需要能够读取字符串和十进制值。 我将其与流一起使用,直到尝试读取双倍为止。 双重不是二进制格式,所以DataInputStream不是我想要的。

我可以将扫描仪用于其getNextFloat,但是使用扫描仪的问题是文件中没有真正的定界符: (test:1.234,rightTest:5.6789)

如果我指定( , : )与扫描仪定界符,然后我失去了测试的分隔符的存在(我thionk,因为它似乎的方式是吃分隔符)的能力。 这些块可以以多种方式彼此嵌套,因此我经常需要测试下一个字符,以查看它是否是开括号,然后分支到不同的逻辑部分。 即它形成一棵树(但是请不要对代码进行解析,因为那是我的家庭作业)。

如果我只能弄清楚如何解析十进制值,那么我可以取消扫描仪,直接返回原始解决方案。 我需要做一个“读取直到找到这些字符之一”的内容,以便我可以说stream.ReadUntil(“,)”)。 小数点后总是逗号或结束括号。 作为一种技巧,我可能一次只能读一个字符。 这是我抓取“ test”和“ rightTest”之类的字符串的相同操作,感觉真的很糟糕。

我唯一知道的另一个选择是带有字符串标记器的东西,但是从示例中我的感觉是,我必须将整个文件读入字符串以对其进行标记,这实质上违反了使用流的目的。 这些文件可能真的很大,就像我自己尝试的一种扩展程序一样,我喜欢尝试编码,这样即使不必要,我也不会将所有内容都放入内存中,尽管对于此分配而言,这并不重要。

所以基本上我正在寻找的是在文件IO的力学一些帮助能够在接下来的字符来偷看,所以我可以检查( , : ) necesary时,也必须阅读串起来的能力a :并读取一个十进制值(最大为:)

您是否从java.io看过PushbackReader 偷看是其用例之一。 下面是一个示例。

PushbackReader pusher = new PushbackReader(reader);
char c = (char)pusher .read();
// code to work with the peeked character
pusher .unread((int)c); //push character back into the buffer

流和扫描器是唯一可接受的选项? 我会使用匹配器模式。 例如,此代码段确定给定html页面的字符集,并使用该字符集对其余内容进行编码:

BufferedReader in = new BufferedReader(new FileReader(new File("index.html")));
String inputLine;
String returnedContent = "";
Pattern charsetPattern = Pattern.compile(".*<meta.*content=\"text/html;.*charset=([A-Za-z0-9\\-]*)\">.*");
while ((inputLine = in.readLine()) != null) {
    if (serviceCharset == null) {
        Matcher m = charsetPattern.matcher(inputLine);
        if (m.find()) {
            charset = m.group(1);//the expression included in the () is one ordered group
        }

    }
    returnedContent += new String(inputLine.getBytes(), charset != null? charset : "UTF8");
}
in.close();

我知道该示例与您的问题没有多大关系,它仅显示了正则表达式在此类问题中的实用性:您逐行读取文件(因此无需担心缓冲区),并使用正则表达式匹配所需的文本。

您也可以尝试通过MappedByteBuffer映射文件以大致访问它,因为它是内存中的字节数组。 如果需要将其视为字符流,则可以将其包装到CharBuffer中 参见例如。 此处 (“ 映射文件”部分)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM