2013-04-16 3 views
0

두 개의 다른 응용 프로그램간에 큰 비트 맵을 보내기 위해 FileStream을 래핑하는 DataStream을 사용하고 있습니다 (인 텐트의 크기는 1MB이며 파일을 저장하지 않습니다. 파일 시스템),명명 된 파이프 대신 FileInputStream 및 File 객체를 사용할 때의 문제

DataInputStream은 스트림이 아직 열려 있지만 데이터가없는 경우 EOFException을 던지고 있습니다. 나는 이것이 단순히 차단 될 것으로 예상했다. (문서가이 문제에 대해 상당히 모호하지만).

DataOutputStream 정렬 :

public void onEvent() { 
    fos.writeInt(width); 
    fos.writeInt(height); 
    fos.writeInt(newBuffer.length); 
    fos.write(newBuffer); 
} 

의 DataInputStream :

while(true) { 
    int width = fis.readInt(); 
    int height = fis.readInt(); 
    int length = fis.readInt(); 
    byte[] bytes = new byte[length]; 
    fis.read(bytes); 
} 

사람이 다른 하나 개의 스레드에서 데이터를 스트림 클래스의 더 나은 세트를 제안 할 수 있습니다 (/) (readInt (읽기) 성공적으로 블록).

단순히 FileInputStreamFileOutputStream를 사용하여 식 DataInputStreamDataOutputStream을 제거하여이를 철하려고했습니다

편집 :

fos.write(intToByteArray(width)); 
    fos.write(intToByteArray(height)); 
    fos.write(intToByteArray(newBuffer.length)); 
    Log.e(this.class.getName(), "Writing width: " + Arrays.toString(intToByteArray(width)) + 
                 ", height: " + Arrays.toString(intToByteArray(height)) + 
                 ", length: " + Arrays.toString(intToByteArray(newBuffer.length))); 
    fos.write(newBuffer); 
    if(repeat == -1) { 
     Log.e(this.class.getName(), "Closing ramFile"); 
     fos.flush(); 
     fos.close(); 
    } 

주는 :

Writing width: [0, 0, 2, -48], height: [0, 0, 5, 0], length: [0, 56, 64, 0]

다른 측면에 나는이 사용

[0, 0, 2, -48] 
Reading width: 720, height: 1280, length: 3686400 

하고 변태, read() 차단하지 않고 그냥 차단하지하지만 모든 값을 작성하지, 즐겁게 영위 :

while(true) { 
    byte[] intByteArray = new byte[] { -1,-1,-1,-1 }; 
    fis.read(intByteArray); 
    Log.e(this.class.getName(), Arrays.toString(intByteArray)); 
    int width = toInt(intByteArray, 0); 
    fis.read(intByteArray); 
    int height = toInt(intByteArray, 0); 
    fis.read(intByteArray); 
    int length = toInt(intByteArray, 0); 
    Log.e(this.class.getName(), "Reading width: " + width + ", height: " + height + ", length: " + length); 
} 

제공합니다 어느 (9,9,9,9에 배열을 초기화하는 것은 여전히 ​​읽기 후에 9, 9, 9, 9 임).

[-1, -1, -1, -1] 
Reading width: -1, height: -1, length: -1 
java.lang.NegativeArraySizeException: -1 

이것은 미친듯한 느낌입니까?

답변

0

매우 간단하게 대답합니다 (잘 설명되어 있지 않음).

FileInputStream에는 read 요청에 대한 시간 제한이 없습니다. 즉, 비어 있지만 닫히지 않은 스트림에서 읽을 경우 바이트를 채우지 않고 반환합니다 ("있는 그대로"의 바이트 남김).

같은 메커니즘을 통해 데이터를 스트리밍 할 수 LocalSocketLocalServerSocket을 사용하고 사용할 수 읽기 작업 (데이터를 사용할 수있을 때까지 차단)하고에 60 초 시간 제한을 강제

LocalServerSocket server = new LocalServerSocket(SOCKET_NAME); 
LocalSocket socket = server.accept(); 
socket.setSoTimeout(60); 

.