使用Java解析混合数据

时间:2011-01-18 18:53:45

标签: java

有点像Java菜鸟,并且已经在大约6种不同的流+扫描仪之间翻转,但仍然没有找到一种方法来完成我需要做的一切。我试图实现一个算法来解析遵循某种语法的文件。有几个地方我需要查看下一个字符,看它是括号还是逗号,还需要能够读取字符串和小数值。我使用了一个流程,直到我试图读取双精度。 double不是二进制格式,因此DataInputStream不是我想要的。

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

如果我指定( , : )作为扫描仪的分隔符,那么我将无法测试它们是否存在分隔符(我是thionk,因为它似乎是吃掉分隔符的方式)。这些块可以以各种方式彼此嵌套,因此我经常需要测试下一个char以查看它是否是一个左括号,然后分支到不同的逻辑部分。即它形成一棵树(但请不要正确的代码来解析树,因为这是我的家庭作业)。

我可以取消扫描仪,如果我只能弄清楚如何解析小数值,只需使用流回到我原来的解决方案。我需要做一些“读,直到你找到其中一个字符”,这样我就可以说stream.ReadUntil(“,)”)。小数总是后跟逗号或结束语。作为一个黑客,我可能一次只读一个字符。这就像我抓住像“test”和“rightTest”这样的字符串一样,感觉非常糟糕。

我知道的唯一其他选项是带有字符串标记器的东西,但我从示例中得到的感觉是我必须将整个文件读入字符串以对其进行标记,从根本上破坏了使用流的目的。这些文件可能真的很大,就像我自己的exersize一样,我喜欢尝试编码,如果没有必要,我不会把它全部带入内存,即使这个任务并不重要。

基本上我正在寻找的是对文件IO的机制的一些帮助,以便能够查看下一个字符,以便我可以检查( , {{ 1}} :必要时,还可以读取最多)的字符串并读取小数值,最多为::

3 个答案:

答案 0 :(得分:2)

您是否从 java.io 查看了PushbackReader? Peeking是它的一个用例。以下是一个示例。

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

答案 1 :(得分:0)

Stream和Scanner是唯一可以接受的选项吗?我会使用匹配模式。 例如,此片段确定给定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();

我知道这个例子与你的问题没什么关系,它只是显示了在这类问题中正则表达式是多么方便:你一行一行地阅读文件(所以不用担心你的缓冲区)并匹配你需要的文本使用正则表达式。

答案 2 :(得分:0)

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

相关问题