2012-04-17 2 views
1

한 줄씩 파일을 읽습니다. 파일은 CipherOutputStream으로 인코딩되고 나중에 DeflaterOutputStream으로 압축됩니다. 이 파일은 러시아 문자와 같은 UTF-8 문자로 구성 될 수 있습니다.BufferedReader가 읽은 파일에서 오프셋을 가져 옵니까?

실제로 읽은 파일의 오프셋 또는 br.ReadLine() 명령으로 읽은 바이트 수를 가져 오려고합니다. 문제는 파일이 암호화되고 압축되어 있기 때문에 읽기 문자열 길이가 파일의 읽기 바이트 수보다 큽니다.

  InputStream fis=tempURL.openStream();      //in tempURL I've got an URL to download 
      CipherInputStream cis=new CipherInputStream(fis,pbeCipher); //CipherStream 
      InflaterInputStream iis=new InflaterInputStream(cis);  //InflaterInputStream 
      BufferedReader br = new BufferedReader(
        new InputStreamReader(iis, "UTF8"));    //BufferedReader 
      br.readLine(); 

      int fSize=tempURL.openConnection().getContentLength();  //Catch FileSize 

답변

4

Apache Commons IO 프로젝트에서 CountingInputStream를 사용

InputStream fis=tempURL.openStream(); 
CountingInputStream countStream = new CountingInputStream(fis); 
CipherInputStream cis=new CipherInputStream(countStream,pbeCipher); 
... 

나중에 당신은 countStream.getByteCount()하여 파일 위치를 얻을 수 있습니다.

+1

이렇게하면 읽은 바이트 수가 계산됩니다. 읽은 행의 실제 바이트 수는 이보다 적을 것입니다 (그러나이 경우 가장 좋은 해결책이 될 수 있습니다) –

+0

좋은 생각이지만, 외부 라이브러리를 사용하고 싶지 않습니다. 왜냐하면이 코드를 애플릿에서 사용하기 때문입니다. , 그래서 나는 가능한 한 가장 작은 크기의 앱을 갖고 싶지 않다. 사실, 나는 다른 방법으로 이것을 알아 낸다. 나는 파일에 쓸 때, 시작될 때 파일에 쓸 줄 수를 세고, 그 다음이 수를 파일에 쓴다. 그리고 읽는 동안 나는 대략 알 수있다. 파일 읽기 진행률. 몇 분 동안이 주제를 유지 한 다음 닫을 것입니다. 어쨌든, 도와 줘서 고마워! – filipbe

1

압축 파일의 경우 문자열에 전체 바이트 수가 사용되지 않으므로 질문에 답변 할 수 없습니다. 예 : 그것은 일반적으로 훨씬 더 컴팩트 한 것로 암호화 데이터 전에 을 압축하는 것이 가장 좋습니다 : 바이트 압축 바이트 이하를 취할 수 있습니다 BTW

(그렇지 않으면 압축하려고 아무 소용이 없을 것입니다). 데이터가 암호화 된 후 데이터를 압축하면 출력이 기본 64이거나 비슷한 경우에만 도움이됩니다. 압축은 콘텐츠를 예측할 수있을 때 (예 : 반복 시퀀스, 공통 문자) 가장 효과적이지만 반면 암호화의 목적은 데이터를 예측할 수 없게 만드는 것입니다.

관련 문제