[问题] 如何读取不确定数量的档案内容

楼主: j19951102 (j19951102)   2015-03-29 11:57:55
我现在要读取.off file,http://goo.gl/H5tjUY,是一种储存3D图像资讯的格式
例如
OFF
#
# cube.off
# A cube.
# There is extra RGBA color information specified for the faces.
#
8 6 12
1.632993 0.000000 1.154701
0.000000 1.632993 1.154701
-1.632993 0.000000 1.154701
0.000000 -1.632993 1.154701
1.632993 0.000000 -1.154701
0.000000 1.632993 -1.154701
-1.632993 0.000000 -1.154701
0.000000 -1.632993 -1.154701
4 0 1 2 3 1.000 0.000 0.000 0.75
4 7 4 0 3 0.300 0.400 0.000 0.75
4 4 5 1 0 0.200 0.500 0.100 0.75
4 5 6 2 1 0.100 0.600 0.200 0.75
4 3 2 6 7 0.000 0.700 0.300 0.75
4 6 5 4 7 0.000 1.000 0.000 0.75
第一行是OFF
再来可能有注解,用#开头,注解可以在一行中的任意位置
再来8 6 12代表顶点、面、边的个数
接下来8行是顶点的座标
再接下来六行是面的资讯,每一行的第一个数代表这个面有多少顶点
如4 0 1 2 3,代表有四个顶点,后面的四个数字是4个顶点的index
一行中最后面的4个数代表RGBA的资讯,这4个数可有可无
现在问题是我不知道该怎么读取这个档案好:
1)我用scanner去读,用readline读最前面的注解,像这样:
int vertexCount;
int faceCount;
int edgeCount;
String line = "";
while ((line = scanner.nextLine()) != null) {
if (line.startsWith("OFF"))
continue;
else if (line.startsWith("#"))
continue;
else {
String count[] = new String[3];
count = line.split(" ");
vertexCount = Integer.parseInt(count[0]);
faceCount = Integer.parseInt(count[1]);
edgeCount = Integer.parseInt(count[2]);
break;
}
问题是8 6 12这行不一定是用一个空白分开的,可能是用好几个空白分开,
或是最前面也有空白," 8 6 12",这样用nextInt比较好,但是在readline之前
我又不知道这行是不是注解。所以该如何读取这行?
2) 在读取面的资讯时,我用nextInt读取,但是我不知道如何判断这个档案会不会包含
RGBA的资讯,就是不知道一行到底会有多少数字,该如何解决?
问题很多,谢谢你的耐心
作者: swallowcc (guest)   2015-03-29 12:02:00
split with space, get array length
楼主: j19951102 (j19951102)   2015-03-29 12:08:00
忘了说,面的资讯间的空格也可能是不止一个空白
作者: Expsun (无限燃烧)   2015-03-29 12:10:00
regex?
作者: swallowcc (guest)   2015-03-29 12:12:00
split以后把长度 > 0 的拿出来,或者上楼上说的更简单像
楼主: j19951102 (j19951102)   2015-03-29 12:49:00
我试试regex,没有用过
作者: haha02 (来人!上夹棍!)   2015-03-31 22:31:00
一行读进来之后先trim然后再用\\s+做split试试?
作者: k47100014 (MIT_No.14)   2015-04-12 18:07:00
如果遇到很多空白的我会用循环+取代s = s.replaceAll("__","_"); //底线为空格然后再用split去隔开

Links booklink

Contact Us: admin [ a t ] ucptt.com