我正在尝试制作一个简单的算法,将.obj文件转换为我的程序可以使用的数据。
这是输入字符串数据示例: “v 1.000000 -1.000000 -1.000000” “f 1 2 3 4”
file = new BufferedReader(new InputStreamReader(am.open("test.obj"))); //Loads the .obj
String out = " ";
try{
while((out=file.readLine()) != null){ //Grabs a line from the file and checks so that it aint null
int index = 1;
int nextIndex = 1;
if(out.startsWith("v")){Log.w("OBJs", out); //If line starts with "v", go ahead
while(index != out.lastIndexOf(" ")){ //checks so the index is not the last index of an empty space " "
nextIndex = out.indexOf(" ", index +1); //Looks for the next occurance of an empty space from +1 of current empty space
vertices.add(Float.valueOf(out.substring(index, nextIndex))); //Grabs the string in between the two spaces
index = nextIndex;//
}
vertices.add(Float.valueOf(out.substring(index, out.length())));//Grabs the last variable from the file as the above while is now false
}
int index2 = 1;
int nextIndex2 = 1;
if(out.startsWith("f")){Log.w("OBJs", out);// THis works exactly as above, gives error and i dunno why
while(index2 != out.lastIndexOf(" ")){
nextIndex2 = out.indexOf(" ", index2 +1);
edges.add(Integer.valueOf(out.substring(index2, nextIndex2)));
Log.w("OBJs", out.substring(index2, nextIndex2));
index2 = nextIndex2;
}
edges.add(Integer.valueOf(out.substring(index2, out.length())));
}
}
}
这导致:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{my.stuffs.blodvite/my.stuffs.blodvite.MainActivity}: java.lang.NumberFormatException: Invalid int: " 1"
这只发生在第二个循环段,我正在尝试收集面部信息。收集顶点可以完美地工作,我使用完全相同的算法,所以我不明白问题是什么。 还有一点值得注意的是,当我上次关闭eclipse时,我觉得它确实有效,不知道发生了什么,或者我是否记得错了。哦,正如您从代码中看到的那样,它将其读取行打印到Log cat。这就是结果。
01-26 23:42:13.916: W/OBJs(18442): v 1.000000 -1.000000 -1.000000
01-26 23:42:13.916: W/OBJs(18442): v 1.000000 -1.000000 1.000000
01-26 23:42:13.916: W/OBJs(18442): v -1.000000 -1.000000 1.000000
01-26 23:42:13.916: W/OBJs(18442): v -1.000000 -1.000000 -1.000000
01-26 23:42:13.916: W/OBJs(18442): v 1.000000 1.000000 -0.999999
01-26 23:42:13.916: W/OBJs(18442): v 0.999999 1.000000 1.000001
01-26 23:42:13.916: W/OBJs(18442): v -1.000000 1.000000 1.000000
01-26 23:42:13.916: W/OBJs(18442): v -1.000000 1.000000 -1.000000
01-26 23:42:13.916: W/OBJs(18442): f 1 2 3 4
因此,它清楚地显示顶点采集没有错误,但是面部聚集在第一次迭代时停止。
答案 0 :(得分:1)
这是因为您在“1”中有一个前导空格。正如@Raghav Sood已经指出的那样,在尝试解析为int以使其工作之前,您可以在Strings上调用trim。您也可以简单地从index2 + 1开始获取子字符串(即跳过第一个空格)。
我很好奇你为什么不直接使用StringTokenizer。