2012-09-17 115 views
1

我最近決定將我的3d模型格式轉換爲二進制文件而不是ASCII,希望能夠提高速度......我閱讀了一些java教程和最簡單的閱讀方式我的格式似乎是使用ObjectInputStream和readLong()和readFloat()命令的混合...但我似乎無法讓代碼工作...使用ObjectInputStream從資產中讀取二進制文件

這是我的測試代碼:

void testLoadBin(String fileName, Context context){ 
try { 
    InputStream fis = context.getAssets().open(fileName); 
    ObjectInputStream is = new ObjectInputStream(fis); 
    long test; 
    test = is.readLong(); 
    Log.i("World", "output" + test); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    Log.i("World", "ERROR"); 
    } 
} 

在這個例子中,我只是想從文件中讀取第一個LONG,但IOException總是拋出,我不知道該怎麼做來解決這個問題。

任何幫助將是有用的。


快速添加: 堆棧跟蹤誤差輸出:

09-18 00:16:08.559: INFO/World(3861): java.io.StreamCorruptedException 
09-18 00:16:08.559: INFO/World(3861):  at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2369) 
09-18 00:16:08.559: INFO/World(3861):  at java.io.ObjectInputStream.<init>(ObjectInputStream.java:433) 
09-18 00:16:08.559: INFO/World(3861):  at org.ogl.ndkvbo.Screen.testLoadBin(Screen.java:6605) 
09-18 00:16:08.559: INFO/World(3861):  at org.ogl.ndkvbo.camState_intload.update(camState_intload.java:24) 
09-18 00:16:08.559: INFO/World(3861):  at org.ogl.ndkvbo.StateMachine.update(StateMachine.java:65) 
09-18 00:16:08.559: INFO/World(3861):  at org.ogl.ndkvbo.camera.update(camera.java:46) 
09-18 00:16:08.559: INFO/World(3861):  at org.ogl.ndkvbo.GameThread.run(GameThread.java:50) 
+0

IOException詳細說明了什麼?你確定,文件存在於給定的路徑中嗎?它實際上是一個「長」嗎? – Fildor

回答

2

必須使用的ObjectOutputStream()如果你想使用的ObjectInputStream()。然而,由於ObjectInputStream和ObjectOutputStream從DataOutputStream和DataInputStream擴展,所以沒有任何東西可以阻止你。

因此,如果您還可以將您要寫入文件的代碼片段發佈出來,這將會很有幫助。同時檢查InputStream fis = context.getAssets().open(fileName);行中的fis是否正確,並確實指向您想要讀取的文件。

+1

啊......我沒有意識到二進制文件必須通過ObjectOutputStream特別製作...我通過Blender導出使用file.write(struct.pack(「f」,output_float))樣式的命令...(「l」表示已經輸出多少)...... 如果這一切都是錯誤的,你能否指出我應該看到什麼命令的方向? – Kalisme

+0

那麼如果你確實想讀取二進制文件,你必須知道你用來寫入文件的協議。假設你寫了int,並且如果你正在使用DataInputStream讀取一個int,你可能並不總是得到正確的結果,因爲DataInputStream要求int爲BigEndian,所以如果你在LittleEndian中寫入int,你將會得到垃圾。 –

+0

在java中關閉可能是Buffer。查看http://docs.oracle.com/javase/1.4.2/docs/api/java/nio/ByteBuffer.html。不過,我仍然認爲,如果在寫入之前調用pack,可能會遇到困難,因爲您並不總是知道要讀取多少字節......但如果您不打包,這肯定會對您有所幫助 –