2011-12-22 4 views
10

InputStream 사용법을 배우고 있습니다. 나는 BufferedInputStream을위한 마크를 사용하려고했지만, 내가 다시 할 때 나는이 예외가 :버퍼링 된 입력 스트림 마크 읽기 한계

java.io.IOException: Resetting to invalid mark 

나는 이것이 내 표시가 제한을 잘못 설정되어 읽을 것을 의미한다고 생각합니다. 실제로 mark()에서 읽기 제한을 설정하는 방법을 모른다. 나는 이런 식으로 시도 :

is = new BufferedInputStream(is); 
is.mark(is.available()); 

이것은 잘못되었습니다.

is.mark(16); 

이 경우에도 동일한 예외가 throw됩니다. 내가 설정해야하는 읽기 제한을 어떻게 알 수 있습니까? 입력 스트림에서 다른 파일 크기를 읽으므로

+2

내 개인 취향이 맞습니까? 마크를 사용하지 마십시오. 확실한 이유가 있지만 확실한 이유가 있습니다. 처음에는 빈약 한 취급의 표시 인 경우가 종종 있습니다. 나는 그것이 가지고있는 가장 원시 형태를 다루지 않는 한, 하나의 흐름을 하나의 흐름이 아니라고 생각하는 경향이있다. 차라리 그 정보를 얻은 패키지 주위에 단단한 래퍼 (wrapper)를 갖고 싶습니다. 패키지를 패키지에 넣고 그 패키지를 앱 어딘가에서 보냅니다. – corsiKa

+0

@glowcoder 의견을 보내 주셔서 감사합니다. 앞서 말했듯이, 나는 InputStream을 사용하여 새로운 일을합니다. 실제로 입력 스트림을 두 번 사용하려고했습니다. 나는 이것이 이것을하는 방법이라고 생각했다. 마크 및 리셋 설정. 이것을 어떻게 얻는 지에 대한 다른 제안이 있습니까? –

+3

마크는 이와 같이 작동합니다. 입력 스트림이'A B C D E '가 될 것이라고 가정 해 봅시다. 지금까지'A B'를 처리합니다. ('다운 스트림'이 무엇인지 아직 모르고 있음을 기억하십시오.) 표시합니다. 그런 다음 좀 더 읽고 C D E를 얻습니다. 당신은 그것을보고 "잠깐, 나는이 모드에서'C D E'를 처리 할 수 ​​없다!"라고 말한다. 이유가 무엇이든지. 그래서 당신은 "정말로 다시 C D E를 처리 할 수 ​​있기를 바란다. 당신이 할 수있는 것은, 당신이 그것을 표시했기 때문이다.스트림을 표시 할 때의 위치로 되돌리려면 'reset()'하고 이전처럼 다시 읽을 수 있습니다. – corsiKa

답변

0

mark()에 전달하는 값은 재설정해야하는 금액입니다. 스트림의 시작 부분으로 재설정해야하는 경우 전체 스트림만큼 큰 버퍼가 필요합니다. 큰 스트림에는 잘 맞지 않으므로 이것은 아마도 훌륭한 디자인이 아닙니다. 스트림을 두 번 읽어야하고 데이터 원본을 모르는 경우 (예 : 파일 인 경우 다시 열 수 있음) 임시 파일에 복사하여 파일을 다시 볼 수 있도록해야합니다. 의지대로 읽으십시오.

+0

답을 사용하는 것을 보았다. 그것을 처음으로 재설정 할 계획이었습니다. 하지만 지금은 좋은 생각이 아니라고 생각합니다. 내가 임시 파일에 복사해야한다고 말했을 때, 사용하기 전에 먼저 내 폴더에 어딘가에 저장해야한다는 뜻인가요? –

+0

@ NurAini - 예, 임시 파일을 만들고 스트림을 복사 한 다음 필요한만큼 여러 번 임시 파일을 다시 읽을 수 있습니다. 귀하의 의견에 – jtahlborn

6

mark 다음에 수행 할 작업을 결정하기 위해 읽은 것 이상으로 몇 바이트를 검사해야하는 경우 유용 할 때가 있습니다. 그런 다음 다시 마크로 다시 설정하고 파일 포인터가 처음에 오길 기대하는 루틴을 호출하십시오 입력의 논리적 인 부분의 나는 그것이 정말로 다른 많은 것들을위한 것이라고 생각하지 않는다. 당신이 BufferedInputStream를위한 JavaDoc를 보면

그것은

마크 작업이 입력 스트림에 점을 기억하고 리셋 동작은 가장 최근의 마크 작업 이후에 읽은 모든 바이트가 새로운 전에 다시 읽어되도록 말한다 바이트는 포함 된 입력 스트림에서 가져옵니다. 당신이 스트림에서 자리를 표시하면

여기서 기억해야 할 중요한 것은, 당신이 표시된 길이를 넘어 계속 읽어 경우 이 마크는 더 이상 유효하지 않습니다 및 재설정에 대한 호출이 실패합니다. 따라서 특정 상황에서는 표시가 좋으며 다른 경우에는 그렇지 않습니다.

+0

주셔서 감사합니다. '독서를 계속하고 완충액을 보충해야하는 경우'라고 말했을 때. BufferedInputStream을 사용했기 때문에 그러한 일이 발생 했습니까? –

+0

그러나 버퍼링되지 않은 IO 스트림은 표시 및 재설정을 지원하지 않습니다. – Bill

1

동일한 BufferedInputStream에서 5 번 읽습니다.

for (int i=0; i<5; i++) { 
    inputStream.mark(inputStream.available()+1); 
    // Read from input stream 
    Thumbnails.of(inputStream).forceSize(160, 160).toOutputStream(out); 
    inputStream.reset(); 
}