2010-07-21 4 views
5

파일의 끝 부분에 추가 된 센티널 문자 (1 바이트)가있는 거대한 파일 세트가 있습니다. 마지막 바이트를 (문자인지 확인하기 위해) 어떻게 읽을 수 있고 크기를 줄일까요? (예 : 문자를 제거하십시오)?파일의 마지막 바이트를 읽고 크기를 자릅니다.

나는 모든 것을 읽을 수 있고 마지막 문자를 제외한 모든 것을 다시 쓸 수 있다는 것을 알고 있지만 특정 바이트에 도달 할 수있는 방법이 있어야합니까?

+2

나에게 위험한 것 같습니다. 정규 파일에 특수 바이트가 있으면 어떻게 될까요? – tafa

+0

@tafa 특정 파일 세트를 작성 중이므로 제거하는 것이 안전하다는 것을 알고 있습니다. – NullUserException

답변

11

RandomAccessFile 클래스를 사용하여 파일 끝에 도달하여 읽은 다음 setLength()을 사용하여 파일을자를 수 있습니다. 업데이트

:

File target = new File("/path/to/file"); 
RandomAccessFile file = new RandomAccessFile(target,"rwd"); 
file.seek(target.length()-1); // Set the pointer to the end of the file 
char c = file.readChar(); 
if(c == '|') // Change the pipe character to whatever your sentinel character is 
{ 
    file.setLength(target.length()-1); // Strip off the last _byte_, not the last character 
} 

참고 : 여기에는 일부 코드의 파일이 아닌 8 비트 인 경우이 코드, 오류 처리 등

을 테스트하지 않았습니다 문자 집합 인 경우 target.length()-1을 조정해야합니다.

+0

+1이 필요하지 않지만 + 코드 작성을 확인합니다. 하지만 RandomAccessFile은 제가 찾고있는 파일입니다. 그리고 네, 분명히 RandomAccessFile의 모든 단일 메서드는 IOException을 throw합니다. – NullUserException

+0

'file.readChar()'는 데이터가'DataOutput' 또는 호환되는 인코딩 (UTF-16LE라고 생각합니다)을 사용하여 작성된 경우를 제외하고는 여기에서 의미가 없습니다. 어떤 경우에도 지정된 * 센티널 문자 (1 바이트) *에 대해 작동하지 않습니다. 'readByte()'를 사용하는 것이 적절할 것입니다. – maaartinus

관련 문제