글쎄, (세미 같은) 질문 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 이상이어야합니다.
도와주세요, 여기 가능한 오류 또는 상황이 무엇입니까?! 사전에
감사합니다.
실행하면 어떻게됩니까? decrypt 메소드에서 예외를 삼키지 않았다면 아마 도움이 될 것입니다. x.printStackTrace()를 catch 블록에 넣고, rebuild, ru-run하고, 도움이되는지 확인하십시오. – DaveH
예외가 없으므로 각 호출에서'4096' 바이트를 읽지 않습니다. @DaveHowes –
이상한 행동이 아닙니다. 정확히 정의 된 동작입니다. 당신은 단순히 그것이 이클립스에서 이런 방식으로 작동한다면, 다른 곳에서도 똑같은 방식으로 작동 할 것이라고 생각했습니다. – Kayaman