2013-12-10 7 views
0

글쎄, (세미 같은) 질문 here을 게시했는데, 일반적으로 문제를 묻지 만 문제가 발생했습니다. 그리고 이것은 IO 문제입니다.jar 파일의 이상한 입출력 동작

우리 프로그램에서 파일 (약 10MB)을 읽고 해독해야하므로 다음 클래스를 사용하고 있습니다.

class FileStream extends InputStream { 
    public int available() throws IOException { 
    return baseStream.available(); 
    } 
    public boolean markSupported() { 
    return false; 
    } 
    InputStream baseStream; 
    byte[] data = new byte[1048576]; 
    int loopRead = 0; 
    int streamSize; 
    int dataRead; 
    public FileStream(InputStream is) throws Exception { 
    this.baseStream = is; 
    streamSize = is.available(); 
    } 
    public int read() { 
    if (dataRead == streamSize) { 
     return -1;/* End of the stream */ 
    } 
    dataRead++; 
    if (loopRead == data.length) { 
     decrypt(); 
    } 
    return data[loopRead++]; 
    } 
    byte[] tempRead = new byte[4096];// block(smallest) decryption size 
    void decrypt() { 
    try { 
     int r; 
     for (int i = 0; i < (data.length/tempRead.length); i++) { 
     System.out.print("Data Available: "+baseStream.available()); 
     r = baseStream.read(tempRead);// read from base stream, ERROR IS HERE! 
     System.out.print("Data read: "+r);//not always 4096 in jar file, vary numbers! 
     if (r <= 0) { 
      return; 
     } 
     System.arraycopy(tempRead, 0, data, (i * tempRead.length), 
      tempRead.length); 
     }// end-for 
     // /////decrypt the data//////// 
     loopRead = 0; 
    } catch (Exception ex) { 
    } 
    } 
} 
내가 eclipse에서 실행할 때 WORKS 그것을

,하지만 난 JAR 파일 (수출)을 생성하고 명령 행 (java -Xmx1280M -jar app.jar)에서 실행할 때, 데이터가 정확 읽지 않습니다.

블록 크기 (암호 블록 크기)는 4096이므로 파일 크기는 4096으로 나눌 수 있으므로 실제로 이런 일이 발생하는 이유를 알 수 없습니다. 매번 4096 바이트의 데이터를 읽어야하지만 그렇지 않습니다. 항상 데이터 가용성이 4096 이상이어야합니다.

도와주세요, 여기 가능한 오류 또는 상황이 무엇입니까?! 사전에

감사합니다.

+0

실행하면 어떻게됩니까? decrypt 메소드에서 예외를 삼키지 않았다면 아마 도움이 될 것입니다. x.printStackTrace()를 catch 블록에 넣고, rebuild, ru-run하고, 도움이되는지 확인하십시오. – DaveH

+0

예외가 없으므로 각 호출에서'4096' 바이트를 읽지 않습니다. @DaveHowes –

+0

이상한 행동이 아닙니다. 정확히 정의 된 동작입니다. 당신은 단순히 그것이 이클립스에서 이런 방식으로 작동한다면, 다른 곳에서도 똑같은 방식으로 작동 할 것이라고 생각했습니다. – Kayaman

답변

1

이것은 기본 IO입니다. read(byte[]) 메서드가 InputStream 인 경우 데이터로 가득 찬 전체 바이트 배열을 읽을 수 있다고 보장 할 수 없습니다. 그래서 실제로 읽은 바이트 수를 반환합니다.

DataInputStream에는 배열을 완전히 채우는 readFully() 메서드가 있습니다.

+0

그래서 이클립스에서 실행할 때 아무 문제없이 작동하는 이유는 무엇입니까? 왜 데이터 가용성은 항상 요청 된 것 이상입니까? –

+0

입니다. 그래서 이유가 있습니다. read (byte [])에 대한 계약은 최대 byte []. length 바이트까지 읽을 수 있다고 정의하고 그에 따라 코딩해야합니다. 정의를 무시하면 현재 가지고있는 것과 같은 상황에 처하게됩니다. 이클립스에서 작동하는지는 중요하지 않습니다. 코드화 된 방식으로 작동하는 것은 보장 할 수 없습니다. – Kayaman

+0

고마워, 너는 왕이야 :) –