Del estudio anterior, sabemos que si va a leer un archivo, necesita crear un flujo de entrada que apunte al archivo; si va a escribir un archivo, debe crear un flujo de salida que apunte al archivo; Entonces, ¿puedes crear una secuencia a través de la cual puedas leer y escribir archivos? De esto es exactamente de lo que trata esta sección sobre transmisiones aleatorias.
La secuencia creada por la clase RandomAccessFile se llama secuencia aleatoria . A diferencia de las secuencias de entrada y salida anteriores, la clase RandomAccessFile no es una subclase de la clase InputStream ni una subclase de la clase OutputStream. Sin embargo, el punto de la secuencia creado por la clase RandomAccessFile se puede utilizar como origen de la secuencia o como destino de la secuencia. En otras palabras, cuando se prepare para leer y escribir un archivo, cree una secuencia aleatoria que apunte al. archivo, por lo que puede leer datos del archivo desde esta secuencia y también puede escribir datos en el archivo a través de esta secuencia.
Los siguientes son los dos constructores de la clase RandomAccessFile:
El parámetro de nombre se utiliza para determinar un nombre de archivo, proporcionando el origen de la secuencia creada, que también es el destino de la secuencia. El modo del parámetro es r (solo lectura) o rw (lectura-escritura), que determina los derechos de acceso de la secuencia creada al archivo.
El archivo de parámetros es un objeto Archivo que proporciona el origen de la secuencia creada y también es el destino de la secuencia. El modo del parámetro es r (solo lectura) o rw (lectura-escritura), que determina los derechos de acceso de la secuencia creada al archivo.
Nota : cuando la secuencia RandomAccessFile apunta a un archivo, el archivo no se actualiza.
Hay un método de búsqueda (a larga) en la clase RandomAccessFile que se utiliza para localizar la posición de lectura y escritura de la secuencia RandomAccessFile. El parámetro a determina el número de bytes desde la posición de lectura y escritura hasta el comienzo del archivo. Además, la secuencia también puede llamar al método getFilePointer() para obtener la posición actual de lectura y escritura de la secuencia. La secuencia RandomAccessFile es más flexible para leer y escribir archivos que la lectura y escritura secuencial.
Por ejemplo, escriba varios enteros int en un archivo llamado tom.dat y luego lea los datos en orden inverso:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFileinAndOut=null;intdata[]={1,2,3,4,5,6,7,8,9,10};try{inAndOut=newRandomAccessFile (tom.dat,rw);for(inti=0;i<data.length;i++){inAndOut.writeInt(data[i]);}for(longi=data.length-1;i>=0;i --){inAndOut.seek(i*4);System.out.printf(t%d,inAndOut.readInt());/*Un dato de tipo int ocupa 4 bytes, inAndOut comienza desde el 36 del archivo Leer los últimos bytes enteros y leer un número entero cada 4 bytes hacia adelante*/}inAndOut.close();}catch(IOExceptione){}}}
Los métodos comunes de la secuencia RandomAccessFile son los siguientes:
Nota : Cuando el método readLine() de la secuencia RandomAccessFile lee archivos que contienen caracteres que no son ASCⅡ, como archivos que contienen caracteres chinos, aparecerán "caracteres confusos". Por lo tanto, es necesario volver a codificar la cadena leída por readLine() usando la codificación "iso-8859-1" y almacenarla en una matriz de bytes, y luego usar la codificación predeterminada de la máquina actual para convertir la matriz en una cadena. El funcionamiento es el siguiente:
Stringstr=in.readLine();
byteb[]=str.getBytes(iso-8859-1);
Contenido de cadena = cadena nueva (b);
Si la codificación predeterminada de la máquina es "GB2312", entonces
Contenido de cadena = cadena nueva (b);
equivalente a
Contenido de cadena=newString(b,GB2312);
Por ejemplo:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFilein=null;try{in=newRandomAccessFile(Main.java,rw);longlength=in.length();//Obtener la longitud del archivo longposition= 0; in.seek(position);// Ubica la posición de lectura al principio del archivo while(position<length){Stringstr=in.readLine();byteb[]=str.getBytes(iso-8859-1) ;str =newString(b);position=in.getFilePointer();System.out.println(str);}}catch(IOExceptione){}}}