Из предыдущего исследования мы знаем, что если вы собираетесь читать файл, вам нужно создать входной поток, указывающий на файл; если вы собираетесь записать файл, вам нужно создать выходной поток, указывающий на файл; Итак, можете ли вы создать поток, через который вы сможете как читать, так и записывать файлы? Именно об этом и пойдет речь в этом разделе о случайных потоках.
Поток, созданный классом RandomAccessFile, называется случайным потоком . В отличие от предыдущих потоков ввода и вывода, класс RandomAccessFile не является ни подклассом класса InputStream, ни подклассом класса OutputStream. Однако точка потока, созданная классом RandomAccessFile, может использоваться как источник потока или как место назначения потока. Другими словами, при подготовке к чтению и записи файла создайте случайный поток, указывающий на него. файл, поэтому вы можете читать данные из файла из этого потока, а также вы можете записывать данные в файл через этот поток.
Ниже приведены два конструктора класса RandomAccessFile:
Параметр name используется для определения имени файла, указывающего источник созданного потока, который также является местом назначения потока. Режим параметра — r (только чтение) или rw (чтение-запись), который определяет права доступа создаваемого потока к файлу.
Файл параметров — это объект File, который указывает источник созданного потока, а также является местом назначения потока. Режим параметра — r (только чтение) или rw (чтение-запись), который определяет права доступа создаваемого потока к файлу.
Примечание . Если поток RandomAccessFile указывает на файл, файл не обновляется.
В классе RandomAccessFile есть метод search(long a), который используется для определения позиции чтения и записи потока RandomAccessFile. Параметр a определяет количество байтов от позиции чтения и записи до начала файла. Кроме того, поток также может вызвать метод getFilePointer() для получения текущей позиции чтения и записи потока. Поток RandomAccessFile более гибок для чтения и записи файлов, чем последовательное чтение и запись.
Например, запишите несколько целых чисел в файл с именем tom.dat, а затем прочитайте данные в обратном порядке:
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.wr iteInt(data[i]);}for(longi=data.length-1;i>=0;i--){inAndOut.seek(i*4);System.out.printf(t%d,inAndOut .readIn t());/*Данные типа int занимают 4 байта, inAndOut считывает последнее целое число из 36-го байта файла и считывает целое число каждые 4 байта вперед*/inAndOut .close();}catch(IOExceptione) {}}}
Общие методы потока RandomAccessFile следующие:
Примечание . Когда метод readLine() потока RandomAccessFile считывает файлы, содержащие символы, отличные от ASCⅡ, например файлы, содержащие китайские символы, появляются «искаженные символы». Поэтому необходимо перекодировать строку, прочитанную функцией readLine(), используя кодировку «iso-8859-1», и сохранить ее в массиве байтов, а затем использовать кодировку по умолчанию текущей машины для преобразования массива в строку. . Операция заключается в следующем:
Stringstr=in.readLine();
byteb[]=str.getBytes(iso-8859-1);
Stringcontent = newString (б);
Если кодировка аппарата по умолчанию — «GB2312», то
Stringcontent = newString (б);
Эквивалентно
Stringcontent = newString (b, GB2312);
Например:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFilein=null;try{in=newRandomAccessFile(Main.java,rw);longlength=in.length();//Получить длину файла longposition= 0; в.искать(положительное on);//Находим позицию чтения в начале файла while(position<length){Stringstr=in.readLine();byteb[]=str.getBytes(iso-8859-1);str=newString(b );position=in.getFilePointer();System.out.println(str);}}catch(IOExceptione){}}}