2009-08-27 1 views
0

첫 번째 데이터 블록이 ASCII 메타 데이터 인 사용자 지정 이미지 파일이 있습니다. Java로 파일의 ASCII 메타 데이터 부분을 읽을 수 있어야하며 끝나는시기와 다른 인코딩의 '원시 이미지 데이터'가 시작될 때를 알아야합니다.어떻게 ASCII 코드와 Java의 다른 인코딩 파일을 깨끗하게 읽을 수 있습니까?

나는 모든 파일을 바이트 []로 읽는 것을 생각하고 있었다. 그리고 나서 어떻게 든 바이트를 읽어서 아스키 메타 데이터 섹션의 끝에 도달 할 때까지 아스키로 변환한다. 나는이 자료를 저장할 것이다. 그런 다음 원시 이진 데이터를 다른 순서대로 다시 배열 할 수 있습니다 (읽기 필요 없음). 그러나,이 일을 생각할 수있는 유일한 방법은 바이트 단위로 ascii 항목을 읽고 새 줄을 찾은 다음 줄 바꿈 전에 모든 내용을 연결하고 그 줄의 시작을 나타내는 태그인지 확인하는 것입니다. 미가공 이미지 데이터. 그러나 readLine()을 사용하여 파일의 ascii 부분을 읽은 다음 새 이미지 판독기에서 파일을 다시 열 필요없이 원시 이미지 바이너리로 즉시 시작할 수있는 더 좋은 방법이 있어야하며 다른 독자는 '이미지 시작'태그를 발견했습니다.

아이디어가 있으십니까?

답변

1
  • 열기 (A BufferedInputStream에 싸여) FileInputStream로 파일
  • ByteArrayOutputStream
  • string searching algorithm를 사용하여 "이미지를 시작하는"태그를 찾고, 바이트 입력 스트림 바이트를 읽어 만듭니다. 태그를 발견하면 당신은 ByteArrayOutputStream
  • 으로 검토 한 각 바이트 쓰기, 동시에
  • (즉 암시 적으로 ASCII를 사용하고) char 개별 바이트 캐스트, 당신은에서 이미지 데이터를 읽기 시작할 수 있습니다 입력 스트림
  • ByteArrayOutputStream에서 바이트 배열을 얻고 입력 스트림에 Scanner를 사용하여 쉽게 검색 문자열을 수행하는 것이 가능 수 있습니다 new String(array, "US-ASCII");

를 사용하여 문자열로 변환,하지만 당신은에 있습니다 어떤 patt 조심해 이미지 데이터를 읽지 않고 태그를 찾을 수 있는지 확인하십시오 (별도의 참조를 유지하는 기본 입력 스트림에서 직접 읽으므로).

편집 : 불행하게도 Scanner는 암시 적으로 버퍼를 사용하는 것으로 보이므로 왼쪽 옵션은 "수동으로"문자열 검색을 구현하는 것입니다.

+0

내 "이미지 시작"태그가 실제로 다음과 같은 경우이 작업을 수행 할 수 있습니다. {END} 5 바이트가됩니다. 이 메서드는 여러 바이트 인 문자열을 검색 할 수 있습니까? – sepiroth

+0

예, 물론입니다. 검색이 더 복잡해집니다. 위키피디아의 문자열 검색 알고리즘 페이지를 보거나 Scanner 클래스를 사용하십시오. –

+0

@ 마이클 : 나는 스캐너 경로 (Well, BufferedReader, 어쨌든)를 시도하고있다. BufferedReader.readLine()을 끈 상태에서 FileInputStream을 가져 오는 데 문제가 있습니다. 첫 번째 행을 읽은 후 다음 바이트를 가져 오지만 다음 바이트는 올바르지 않습니다. 뭐가 잘못 됐는지 생각 해봐? – sepiroth

1

확실하지 어쨌든 형식으로 자신 만이 결정할 수있는 경우 :

또 다른 전략은 아스키에 사용되는 바이트 수를 포함하는 파일의 첫 번째 위치에서 정수 값을 작성하는 것입니다

분할. 그러면 바이트 수를 읽을 수 있으며 쉽게 ASCII를 건너 뛰고 이진 BLOB로 바로 이동할 수 있습니다.

이 전략은 효율적이지만 수를 변경하지 않고 ASCII 텍스트 문자의 양을 변경할 수 없습니다.

그건 그렇고, 입력 내용을 살균하십시오. 더 많은 데이터를 읽지 마시고 파일에 들어 있거나 더 많은 메모리를 할당하십시오.

개인적으로 파일의 첫 번째 몇 문자를 사용하여 일부 마법 코드가 포함되어 있으므로 파일이 데이터 형식을 사용하고 있는지, 그리고 데이터 형식이 어떤 버전인지 최소한의 확인 만 할 수 있습니다.