2012-09-17 2 views
1

최근 3D 모델 형식을 ASCII 대신 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에서 확장되므로 아무 것도 사용할 수 없습니다.

따라서 파일에 쓰는 위치에 코드 스 니펫을 게시 할 수 있다면 도움이 될 것입니다. 또한 라인의 fis가 정확한지 그리고 실제로 읽으려는 파일을 가리키고 있는지 확인하십시오.

+1

아 ... 저는 바이너리 파일이 ObjectOutputStream을 통해 구체적으로 만들어 져야한다는 것을 알지 못했습니다 ... 나는 file.write ("f", output_float) 스타일의 명령을 사용하여 블렌더를 통해 파일을 작성했습니다. ... ("l"출력 된 longs) ... 이것이 전부 틀린 경우, 내가 조사해야하는 명령의 방향으로 나를 가리킬 수 있습니까? – Kalisme

+0

바이너리 파일을 읽으려면 파일에 쓰는 데 사용하는 프로토콜을 알아야합니다. 당신이 int를 쓰고 int를 읽고 DataInputStream을 사용하여 int를 읽었다면 DataInputStream이 BigEndian에 int를 요구하므로 항상 올바른 결과를 얻지 못할 수도 있습니다. 따라서 LittleEndian에 int를 쓰면 쓰레기가 생깁니다. –

+0

java의 클로저는 Buffer가 될 수 있습니다. http://docs.oracle.com/javase/1.4.2/docs/api/java/nio/ByteBuffer.html을 확인하십시오. 그러나 나는 아직도 당신이 항상 얼마나 많은 바이트를 읽을 지 알지 못해서 쓰기 전에 팩을 호출하면 힘들어 질지 모른다라고 느낀다. 그러나 이것은 팩을 호출하지 않으면 확실히 도움이 될 수있다. –

관련 문제