Java 使用ObjectInputStream从资产中读取二进制文件

Java 使用ObjectInputStream从资产中读取二进制文件,java,android,binaryfiles,objectinputstream,Java,Android,Binaryfiles,Objectinputstream,我最近决定将我的3d模型格式转换成二进制文件,而不是ASCII文件,希望能提高速度。。。我阅读了一些java教程,阅读我的格式的最简单方法似乎是使用ObjectInputStream和readLong()和readFloat()命令的混合体。。。但我似乎无法让代码正常工作 以下是我的测试代码: void testLoadBin(String fileName, Context context){ try { InputStream fis = context.getAssets().op

我最近决定将我的3d模型格式转换成二进制文件,而不是ASCII文件,希望能提高速度。。。我阅读了一些java教程,阅读我的格式的最简单方法似乎是使用ObjectInputStream和readLong()和readFloat()命令的混合体。。。但我似乎无法让代码正常工作

以下是我的测试代码:

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)
09-18 00:16:08.559:INFO/World(3861):java.io.StreamCorruptedException
09-18 00:16:08.559:INFO/World(3861):位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2369)
09-18 00:16:08.559:INFO/World(3861):位于java.io.ObjectInputStream。(ObjectInputStream.java:433)
09-18 00:16:08.559:INFO/World(3861):org.ogl.ndkvbo.Screen.testLoadBin(Screen.java:6605)
09-18 00:16:08.559:INFO/World(3861):org.ogl.ndkvbo.camState\u intload.update(camState\u intload.java:24)
09-18 00:16:08.559:INFO/World(3861):位于org.ogl.ndkvbo.StateMachine.update(StateMachine.java:65)
09-18 00:16:08.559:INFO/World(3861):org.ogl.ndkvbo.camera.update(camera.java:46)
09-18 00:16:08.559:INFO/World(3861):在org.ogl.ndkvbo.gameshread.run(gameshread.java:50)

如果要使用ObjectInputStream(),必须使用ObjectOutputStream()。但是,没有任何东西禁止您,因为ObjectInputStream和ObjectOutputStream是从DataOutputStream和DataInputStream扩展而来的


因此,如果您还可以将代码片段发布到您要写入文件的位置,这将非常有用。还要检查行
InputStream fis=context.getAssets()中的fis是否打开(文件名)
是正确的,并且实际上指向您要从中读取的文件。

IOException详细说明了什么?您确定该文件存在于给定路径中吗?它真的有“长”字吗?啊。。。我不知道二进制文件必须通过ObjectOutputStream生成。。。我使用file.write(struct.pack(“f”,output\u float))样式的命令通过Blender导出来编写该文件。。。(“l”表示输出的长度)。。。如果这一切都错了,你能告诉我应该研究哪些命令吗?如果你真的想从二进制文件中读取,你必须知道你用来写入文件的协议。假设您编写和int,并且如果您使用DataInputStream读取int,您可能不会总是得到正确的结果,因为DataInputStream将int强制为BigEndian,因此如果您在LittleEndian中编写int,您将得到垃圾。java中的闭包可能是缓冲区。退房然而,我仍然觉得,如果在写之前调用pack,可能会变得很困难,因为您并不总是知道要读取多少字节。。。但是,如果你不打电话给packI,这肯定会对你有所帮助。由于你的评论,packI最终浏览了一个不同的方法,并找到了一个教程,解释了如何使用InputStream和读取二进制文件。。。它将加载时间从大约一分钟改为不到一秒!我将在问题中发布链接。谢谢你的帮助。