如何在Java中以最佳性能解析.stl文件?

如何在Java中以最佳性能解析.stl文件?,java,regex,parsing,stl-format,Java,Regex,Parsing,Stl Format,我得到了下面的.stl文件,我想解析并提取坐标: solid WEMtoSTL_0 facet normal 0.999309 0.0262812 0.0262796 outer loop vertex -49.9111 85.733 -1357.76 vertex -49.9346 86.6265 -1357.76 vertex -49.9346 85.733 -1356.86 endloop endfacet facet normal 0.999158 0.0290085 0.0290067

我得到了下面的.stl文件,我想解析并提取坐标:

solid WEMtoSTL_0
facet normal 0.999309 0.0262812 0.0262796
outer loop
vertex -49.9111 85.733 -1357.76
vertex -49.9346 86.6265 -1357.76
vertex -49.9346 85.733 -1356.86
endloop
endfacet
facet normal 0.999158 0.0290085 0.0290067
outer loop
vertex -49.9346 85.733 -1356.86
vertex -49.9346 86.6265 -1357.76
vertex -49.9633 86.6745 -1356.82
endloop
endfacet
facet normal 0.996327 0.0262471 0.0815064
outer loop
vertex -49.9346 85.733 -1356.86
vertex -49.9633 86.6745 -1356.82
vertex -50.0151 85.733 -1355.88
endloop
endfacet
endsolid WEMtoSTL_0
可以根据需要重复facet和endfacet标记

这就是我所尝试的:

Scanner face_scanner = new Scanner(file);
face_scanner.useDelimiter("solid | facet normal | outer loop | vertex | endloop | endfacet");
但是face_scanner.next不会产生我想要的以下结果:

0.999309 0.0262812 0.0262796
-49.9111 85.733 -1357.76
-49.9346 86.6265 -1357.76
-49.9346 85.733 -1356.86
and so on...
编辑: 我现在尝试了以下方法:

Scanner face_scanner = new Scanner(file);
face_scanner.useLocale(Locale.US);
face_scanner.useDelimiter("\\s|\n");

while (face_scanner.hasNext()) {
    if (face_scanner.hasNextFloat()) {
        float curr = face_scanner.nextFloat();
    } else {
        String s = face_scanner.next();
    }
}

对于22402行的示例文件,这需要2分钟以上的时间。有可能在几秒钟甚至更短的时间内完成吗?2分钟对我来说太多了。

Antlr将是一个很好的选择;它具有良好的性能/内存特性,所有低级标记化都由您自己处理

这里有一个语法声明:我是STL ASCII格式的作者


这是一个具有JavaSTL模型的大型项目的一部分,请参见免责声明:我也是这篇文章的作者。快速测试显示~19MB STL文件的解析时间为5.5秒。

提示:您可以使用String类的split函数。split的性能是否优于Scanner?因为我需要高达15MB的大文件的良好性能。现在你正在使用扫描仪解析文件,好像你几乎不知道它是什么样子。是浮子吗?然后读一个浮点数。但是您有一个非常特定的数据格式。例如,如果一条线以“顶点”开头,那么您知道它后面会有三个浮点数。利用这些知识创建一个更具确定性的解析器;我只需要使用BufferedReader一行一行地循环文件,这对我来说一直都很好,包括将文件解析为千兆字节。