2010-07-21 19 views
5

Tengo un gran conjunto de archivos, a todos los cuales hay (debe haber) un carácter centinela (1 byte) adjunto al final del archivo. ¿Cómo puedo leer el último byte (para asegurarme de que es el carácter) y truncarlo al tamaño (es decir, eliminar el carácter)?Lea el último byte del archivo y trunque al tamaño

Sé que podría leer todo y volver a escribir todo menos el último carácter, pero tiene que haber una forma de llegar a un byte específico, ¿verdad?

+2

Me parece peligroso. ¿Qué pasa si un archivo normal tiene ese byte especial? – tafa

+0

@tafa Estoy trabajando en un conjunto específico de archivos, sé que es seguro eliminarlo. – NullUserException

Respuesta

11

Puede usar la clase RandomAccessFile para buscar hasta el final del archivo, leerlo y luego truncar el archivo usando setLength().

Actualización: Aquí hay algo de código:

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 
} 

Nota: No he probado este código, ningún control de errores, etc.

Si el archivo está en cualquiera que no sea de 8 bits juego de caracteres, el target.length()-1 deberá ajustarse.

+0

+1 + comprueban el código de escritura, aunque no lo necesitaba. Pero RandomAccessFile es exactamente lo que estaba buscando. Y sí, aparentemente todos los métodos en RandomAccessFile arrojan una IOException. – NullUserException

+0

'file.readChar()' no tiene sentido aquí, excepto si los datos fueron escritos usando un 'DataOutput' o una codificación compatible (creo que UTF-16LE). En ningún caso funciona para el carácter centinela * especificado (1 byte) *. Usar 'readByte()' sería apropiado. – maaartinus

Cuestiones relacionadas