Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java解析混合数据_Java - Fatal编程技术网

用Java解析混合数据

用Java解析混合数据,java,Java,有点像JavaNoob,在大约6个不同的streams+扫描器之间切换,仍然没有找到一种方法来做我需要做的一切。我试图实现一种算法来解析遵循特定语法的文件。有几个地方我需要查看下一个字符,看看它是括号还是逗号,还需要能够读取字符串和十进制值。我让它与一条流一起工作,直到我试图读取双精度。double不是二进制格式,因此DataInputStream不是我想要的 我可以将扫描仪用于其getNextFloat,但使用扫描仪的问题是文件中没有真正的分隔符:(test:1.234,rightTest:5

有点像JavaNoob,在大约6个不同的streams+扫描器之间切换,仍然没有找到一种方法来做我需要做的一切。我试图实现一种算法来解析遵循特定语法的文件。有几个地方我需要查看下一个字符,看看它是括号还是逗号,还需要能够读取字符串和十进制值。我让它与一条流一起工作,直到我试图读取双精度。double不是二进制格式,因此DataInputStream不是我想要的

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

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

如果我只知道如何解析十进制值的话,我就可以不用扫描仪,只需返回到我的原始解决方案中的一个流。我需要一个“直到找到其中一个字符为止”的东西,这样我就可以说stream.ReadUntil(“,”)。小数后面总是跟一个逗号或结束符。作为黑客,我可能一次只读一个字符。这和我抓取字符串时做的一样,比如“test”和“rightest”,感觉非常糟糕

我唯一知道的另一个选项是使用字符串标记器,但我从示例中感觉到,我必须将整个文件读入字符串以对其进行标记,这基本上违背了使用流的目的。这些文件可能非常大,就像我自己的大小一样,我喜欢尝试并编写代码,以便在不需要时不会将其全部存储在内存中,即使对于这个任务来说这并不重要

因此,本质上,我在寻找有关文件IO机制的帮助,以便能够查看下一个字符,以便在必要时检查
,并且还能够读取最大为a的字符串:,以及最大为a的十进制值:或

您看过fromjava.io了吗?偷看是它的一个用例。下面是一个例子

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();
BufferedReader-in=new-BufferedReader(new-FileReader(新文件(“index.html”));
字符串输入线;
字符串returnedContent=“”;
Pattern charsetPattern=Pattern.compile(“.*.”);
而((inputLine=in.readLine())!=null){
if(serviceCharset==null){
匹配器m=字符集模式匹配器(inputLine);
if(m.find()){
charset=m.group(1);//包含在()中的表达式是一个有序组
}
}
returnedContent+=新字符串(inputLine.getBytes(),字符集!=null?字符集:“UTF8”);
}
in.close();

我知道这个例子与你的问题没有多大关系,它只是展示了regex在这类问题上有多方便:你一行接一行地读取文件(因此不用担心缓冲区),并使用正则表达式匹配所需的文本。

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

谢谢,但这只能让我了解BufferedInputReader的情况。我可以偷看,但我不能做任何像TryParseFloat()这样的事情。因此,当我需要字符串或浮点时,我又回到了每次编写一个字符的循环