[問題] 如何讀取不確定數量的檔案內容

看板java作者 (j19951102)時間10年前 (2015/03/29 11:57), 編輯推噓4(406)
留言10則, 5人參與, 最新討論串1/1
我現在要讀取.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的資訊,就是不知道一行到底會有多少數字,該如何解決? 問題很多,謝謝你的耐心 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.255.103.185 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1427601479.A.02C.html

03/29 12:02, , 1F
split with space, get array length
03/29 12:02, 1F

03/29 12:08, , 2F
忘了說,面的資訊間的空格也可能是不止一個空白
03/29 12:08, 2F

03/29 12:10, , 3F
regex?
03/29 12:10, 3F

03/29 12:12, , 4F
split以後把長度 > 0 的拿出來,或者上樓上說的更簡單
03/29 12:12, 4F

03/29 12:13, , 5F
03/29 12:13, 5F

03/29 12:49, , 6F
我試試regex,沒有用過
03/29 12:49, 6F

03/31 22:31, , 7F
一行讀進來之後先trim然後再用\\s+做split試試?
03/31 22:31, 7F

04/12 18:07, , 8F
如果遇到很多空白的我會用迴圈+取代
04/12 18:07, 8F

04/12 18:09, , 9F
s = s.replaceAll("__","_"); //底線為空格
04/12 18:09, 9F

04/12 18:09, , 10F
然後再用split去隔開
04/12 18:09, 10F
文章代碼(AID): #1L5tX70i (java)
文章代碼(AID): #1L5tX70i (java)