Parsing 为什么BufferedReader在尝试从波阵面obj文件加载时跳过行?

Parsing 为什么BufferedReader在尝试从波阵面obj文件加载时跳过行?,parsing,opengl,lwjgl,wavefront,Parsing,Opengl,Lwjgl,Wavefront,我已经为Java编写了一个简单的波前分析,它显示在以下代码部分: 源代码 它应该如何工作 这个obj解析器应该读取obj文件的内容,该文件由resources/models/MODELFILENAME.obj文件路径访问 首先,它基于文件路径创建一个新的文件读取器,然后使用该文件读取器实例创建一个BufferedReader实例,该实例用于读取指定文件的每一行 然后是while循环。如果到达文件的结尾,则while循环完成(由BufferedReader实例读取的字符串变量行在文件结尾处获取值n

我已经为Java编写了一个简单的波前分析,它显示在以下代码部分:

源代码 它应该如何工作 这个obj解析器应该读取obj文件的内容,该文件由resources/models/MODELFILENAME.obj文件路径访问

首先,它基于文件路径创建一个新的文件读取器,然后使用该文件读取器实例创建一个BufferedReader实例,该实例用于读取指定文件的每一行

然后是while循环。如果到达文件的结尾,则while循环完成(由BufferedReader实例读取的字符串变量行在文件结尾处获取值null)

while循环如下所示:

  • 阅读新行
    line=br.readLine()
  • 检查行是否为空、是否为空或是否以哈希标记开头:
    if(line!=null | | |!line.equals(“”)| |!line.startsWith(“#”)
  • 在有空格的地方拆分读取行:
    String[]splitLine=line.split(“”)
  • 基于
    splitLine
    中的第一个字符串执行相应的代码(即
    v
    vt
    vn
    f
    ):
    开关(splitLine[0])
如果该行以
v
开头,则从
v
后面的数字中创建一个新的Vector3f对象(一个三维向量,其构造函数是
Vector3f(浮点x,浮点y,浮点z)
)。由于在.obj文件中如何定义空格字符,这些数字作为拆分行字符串数组中的第一、第二和第三个索引进行访问。在发送到构造函数之前,它们将从字符串解析为浮点数。然后在最后,将矢量3f的字符串表示形式打印到控制台

类似地,对于纹理坐标(只是创建向量3f而不是向量3f)和法线向量重复该过程

解释剩余的源代码没有意义,因为问题已经在这里出现了

问题 上面的文件解析器似乎只读取了一半的数据(它每隔一行“跳转”一次,处理失败)

这是显示哪些行(以
v
开头)已被处理的输出(即矢量3f由其数据制成):

这是obj文件中
v
的数据:

v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -0.999999
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
如果比较这些数据,很快就会发现,只处理了4行而不是8行。读取第一行,跳过第二行。读取第三行,跳过第四行。就这样继续下去。为什么会出现问题?switch语句中是否存在导致跳过行的错误


感谢您花费的时间。

问题是由以下原因引起的:

while((line = br.readLine()) != null) {
    line = br.readLine();
您已经用
br.readLine()
读取了文件的一行,在循环中再次读取该行后,您将再次读取该行。只需删除第二行
line=br.readLine()你应该很好


此外,您不需要检查
if(line!=null | |
,因为这已经被检查为循环条件。

问题是由以下原因引起的:

while((line = br.readLine()) != null) {
    line = br.readLine();
您已经用
br.readLine()
读取了文件的一行,并且在循环中再次读取该行后,您将再次读取该行。只需删除第二行
line=br.readLine();
,您就可以了


另外,您不需要检查
if(line!=null | |
,因为这已经被检查为循环条件。

哇,谢谢您这么快的重新打印。非常感谢。我一到家就会尝试:DWow,谢谢您这么快的重新打印。非常感谢。我一到家就会尝试:D
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -0.999999
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
while((line = br.readLine()) != null) {
    line = br.readLine();