Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Randomaccessfile java описание

Метод класса Java.io.RandomAccessFile | Комплект 1

Класс Java.io.RandomAccessFile предоставляет способ произвольного доступа к файлам с использованием операций чтения и записи. Он работает как массив байтов, хранящихся в файле.
Декларация:

Методы класса RandomAccessFile:

  1. read ():java.io.RandomAccessFile.read () читает байты данных из файла. Байт возвращается как целое число в диапазоне 0-255
  2. read (byte [] b)java.io.RandomAccessFile.read (byte [] b) читает байты до b.length из буфера.
  3. read ((byte [] b, int offset, int len):java.io.RandomAccessFile.read ((byte [] b, int offset, int len) считывает байты, инициализирующиеся от позиции смещения до b.length из буфера.
  4. readBoolean ():java.io.RandomAccessFile.readBoolean () читает логическое значение из файла.
  5. readByte ():java.io.RandomAccessFile.readByte () читает восьмибитное значение со знаком из файла и начинает чтение с файлового указателя.
  6. readChar ():java.io.RandomAccessFile.readChar () читает символ из файла, начинает чтение из указателя файла.
  7. readDouble ():java.io.RandomAccessFile.readDouble () читает двойное значение из файла, начинайте чтение с указателя файла.
  8. readFloat ():java.io.RandomAccessFile.readFloat () читает значение с плавающей запятой из файла, начинайте чтение с указателя файла.
  9. readFully (byte [] b):java.io.RandomAccessFile.readFully (byte [] b) считывает байты до b.length из буфера, начинает чтение из файлового указателя.
  10. readInt ():java.io.RandomAccessFile.readInt () читает 4-байтовое целое число со знаком из файла и начинает чтение с файлового указателя.
  11. readFully (byte [] b, int offset, int len):java.io.RandomAccessFile.readFully (byte [] b, int offset, int len) считывает байты, инициализирующие от позиции смещения до b.length из буфера, начиная чтение с Файловый Указатель.
  12. readLong ():java.io.RandomAccessFile.readLong () считывает 64-разрядное целое число со знаком из файла и начинает чтение с файлового указателя.

// Java-программа, иллюстрирующая использование методов класса io.RandomAccessFile
// read (), read (byte [] b), readBoolean (), readByte (), readInt ()
// readFully (byte [] b, int off, int len), readFully (), readFloat ()
// readChar (), readDouble (),

public class NewClass

public static void main(String[] args)

float f = 14 .56f;

// Создание нового RandomAccessFile — «GEEK»

RandomAccessFile geek = new RandomAccessFile( «GEEK.txt» , «rw» );

geek.writeUTF( «Hello Geeks For Geeks» );

// Указатель файла в позиции индекса — 0

System.out.println( «Use of read() method : » + geek.read());

// Использование метода .read (byte [] b):

System.out.println( «Use of .read(byte[] b) : » + geek.read(b));

System.out.println( «Use of readBoolean() : » + geek.readBoolean());

System.out.println( «Use of readByte() : » + geek.readByte());

System.out.println( «Use of readChar() : » + geek.readChar());

System.out.println( «Use of readDouble() : » + geek.readDouble());

System.out.println( «Use of readFloat() : » + geek.readFloat());

// Создать массив до geek.length

byte [] arr = new byte [( int ) geek.length()];

String str1 = new String(arr);

System.out.println( «Use of readFully() : » + str1);

// readFully (byte [] b, int off, int len):

geek.readFully(arr, 0 , 8 );

String str2 = new String(arr);

System.out.println( «Use of readFully(byte[] b, int off, int len) : » + str2);

catch (IOException ex)

System.out.println( «Something went Wrong» );

Выход :

Эта статья предоставлена MohitGupta_OMG . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Randomaccessfile java описание

[an error occurred while processing this directive]

Конспект лекций по Java. Занятие 15

[an error occurred while processing this directive](none)

Ввод/вывод (I/O) в Java (продолжение)

Иерархия OutputStream

Принципы построения иерархии OutputStream те же, что и в InputStream . Т.е. вся основная функциональность определяется абстрактным базовым классом OutputStream . Рассмотрим основные методы этой иерархии, определенные в классе OutputStream .

Записывает в поток один байт — младший байт числа, заданного параметром b.

Записывает в поток массив байт.

Модификация предыдущего метода, позволяющая задать смещение в массиве и длину записываемой порции.

Выталкивает из буфера в поток все, что в нем накоплено.

Класс ByteArrayOutputStream .

Позволяет заполнять массив байт операциями вывода в поток.

Класс FileOutputStream .

Это основной класс для работы с файлами. Имеет такие основные конструкторы:

Смысл конструкторов, кроме, возможно, последнего понятен из их описания. Но имеется несколько нюансов.

  • При открытии файла на запись, если файл не существует, то он создается.
  • Если файл существует, то он будет полностью обновлен. Т.е. если открыть и сразу закрыть файл, то реальный файл на диске будет нулевой длины.
  • Исключением из предыдущего правила является последний из конструкторов. Если в нем в качестве третьего параметра ( append ) указать true , то файл будет дописываться.

Какой-либо дополнительной функциональности по сравнению с базовым классом класс FileOutputStream не добавляет.

Класс BufferedOutputStream .

Служит для организации более эффективного буферизованного вывода в поток.

Класс DataOutputStream .

Содержит много хороших методов, но на практике, чаще всего, бесполезен ввиду того, что работает с кодировкой Unicode.

Класс PrintStream .

Содержит много полезных дополнительных методов. Это методы print и println для всех базовых типов. Наиболее часто используются следующие из этих методов

и другие, в принципе, не нужны, т.к. оператор вида

позволяет вывести и числа. А

формирует строку из объекта при помощи метода toString .

  • Существуют два стандартных (предопределенных) потока вывода типа PrintStream: System.out и System.err . Оба они по умолчанию направляют информацию на консоль, но их можно перенаправить в файлы.

Класс ObjectOutputStream мы будем рассматривать позднее.

Класс PipedOutputStream предназначен для передачи информации между программами через каналы ( pipes ).

Иерархия Writer

Как и в случае с иерархией Reader иерархия Writer сама по себе ничего не добавляет к функциональности иерархии OutputStream и отличается от нее всего несколькими нюансами.

Так, вместо ByteArrayOutputStream в данной иерархии присутствует более полезный класс StringWriter , позволяющий выводить информацию в строку.

Практическое использование иерархии Writer

Основным способом создания потока вывода в файл является

После создания такого потока в него можно выводить информацию при помощи методов print и println .

Развернутый пример

Рассмотрим содержательный пример, в котором используются те средства, что мы рассмотрели на данном и предыдущем занятии.

Программа WordConverter.java предназначена для проведения поиска и замены слов в тексте. Она принимает три параметра вызова: имя файла, строку для поиска и строку для замены. В результате ее работы создается файл с именем res.txt , содержащий результаты замены и печатается краткий протокол.

Оттранслируем и запустим на выполнение данную программу. Для примера можно взять в качестве исходного файла текст самой программы WordConverter.java, в качестве строки поиска «thisLine», в качестве строки для замены «theLine».

Здесь использованы те средства и приемы, которые мы рассмотрели на текущем и прошлом занятии. В частности, класс StringTokenizer , рассмотренный в 14-м занятии.

Продолжим изучение библиотеки ввода/вывода Java.

Класс RandomAccessFile

Буквально: файл прямого доступа. Данный класс обеспечивает как операции чтения файла, так и операции записи в файл. Т.е. он объединяет возможности, заложенные в иерархиях Reader и Writer.

Кроме того, он имеет методы, позволяющие выполнять позиционирование на заданный байт файла.

Рассмотрим конструкторы класса RandomAccessFile :

Они отличаются от аналогичных конструкторов классов FileReader и FileWriter наличием параметра mode. Этот параметр может быть равен либо «r» (только чтение), либо «rw» (чтение и запись).

Класс RandomAccessFile имеет большое количество методов как для чтения, так и для записи данных. В частности, он имеет те же методы чтения, что и в InputStream или Reader .

Кроме того, в нем есть метод readLine , аналогичный одноименному методу из BufferedReader , а также методы из DataInputStream : по одному методу вида readXXX для каждого базового типа, например,

Этот метод позволяет считать число с плавающей точкой.

Методы записи такие же, как OutputStream или Writer , плюс методы из DataOutputStream .

К сожалению эксперименты с методам readLine и методами из DataInputStream и DataOutputStream приводят к выводу о наличии проблем при их практическом использовании. Метод readLine имеет проблемы с национальными кодировками, а методы из DataInputStream и DataOutputStream работают с кодировкой Unicode .

Кроме этих методов RandomAccessFile имеет ряд методов для обеспечения произвольного доступа. Это самая важная часть функциональности, которую обеспечивает класс RandomAccessFile .

Возвращает текущую позицию в файле.

Возвращает длину файла.

Устанавливает новую текущую позицию в файле.

Устанавливает новую длину файла. При этом происходит либо усечение, либо расширение файла.

Пропускает n байт файла. Возвращает реально пропущенное число байт (оно будет меньше n, если файл недостаточно длинный для пропуска n байт).

Класс File

Это очень важный класс. Без него нельзя было бы удалить существующий файл, создать каталог (папку), узнать какие файлы есть в данном каталоге.

Класс File имеет следующие конструкторы:

  • Конструкторы класса File не порождают IOException . При создании экземпляра класса File реальный файл с указанным именем может не существовать. При этом он не создается при создании объекта File . Реальная работа с файлом выполняется методами данного класса.

Рассмотрим наиболее важные методы данного класса.

Проверяет, существует ли данный файл.

Проверяет, можно ли читать данный файл. Современные ОС позволяют устанавливать различные полномочия доступа к файлу для разных пользователей. В частности, можно запретить чтение файла тем или иным пользователям. Данный метод возвращает false также в том случае, если файл не существует.

Проверяет, можно ли писать в файл.

Является ли данный файл каталогом (папкой).

Является ли данный файл обычным файлом (не каталогом).

Удаляет файл, если он существует. Файл может быть и каталогом. Тогда он удаляется только в том случае, если он пуст.

Возвращает массив файлов в каталоге (массив объектов класса File).

Создает пустой каталог.

Есть еще целый ряд полезных методов в данном классе (см. документацию).

Практическая работа

1. Рассмотрим программу для удаления всех файлов в указанном каталоге (каталог задается параметром вызова программы).

В данной программе используются следующие методы класса File: isDirectory, listFiles, delete . Нужно разобраться в этой программе и написать ее вариант, который удаляет только те файлы, которые доступны и на чтение и на запись.

2. (Самостоятельная работа).

Изменим программу WordConverter.java так, чтобы она в результате своей работы порождала бы не новый файл res.txt , а модифицировала существующий. При этом исходный файл она должна сохранить с расширением bak .

Изучим проблему. Во-первых, мы не можем сразу писать в тот же файл, из которого мы читаем. Поэтому для вывода нам понадобиться какой-то файл. После окончания обработки исходного файла мы должны его переименовать в файл с расширением bak (нужно не забыть закрыть его перед переименованием). Когда мы переименуем исходный файл, мы можем переименовать выходной файл.

Таким образом, нам потребуется.

a. Возможность создания временного файла.

b. Возможность переименования файлов.

Все это есть в классе File . Во-первых, есть два метода createTempFile . Лучше использовать второй из них.

Иначе могут возникнуть проблемы с переименованием файла, если временный файл будет создан физически не на том же диске, что и исходный. Но в этом случае нам нужно иметь параметр directory — каталог, в котором находится исходный файл. Для получения каталога можно использовать метод

Возможность переименования файлов тоже имеется в классе File — это метод

Теперь осталось только все это собрать воедино и получить работающую программу.

How to Read/Write from RandomAccessFile in Java

Random access file is a special kind of file in Java which allows non-sequential or random access to any location in file. This means you don’t need to start from 1st line if you want to read line number 10, you can directly go to line 10 and read. It’s similar to array data structure, Just like you can access any element in array by index you can read any content from file by using file pointer. A random access file actually behaves like a large array of bytes stored in file system and that’s why its very useful for low latency applications which needs some kind of persistence e.g. in front office trading application and FIX Engine, you can use random access file to store FIX sequence numbers or all open orders. This will be handy when you recover from crash and you need to build your in memory cache to the state just before the crash. RandomAccessFile provides you ability to read and write into any random access file. When you read content from file, you start with current location of file pointer and pointer is moved forward past how many bytes are read. Similarly when you write data into random access file, it starts writing from current location of file pointer and then advances the file pointer past number of files written. Random access is achieved by setting file pointer to any arbitrary location using seek() method. You can also get current location by calling getFilePointer() method. There are two main ways to read and write data into RandomAccessFile, either you can use Channel e.g. SeekableByteChannel and ByteBuffer class from Java NIO, this allows you to read data from file to byte buffer or write data from byte buffer to random access file. Alternatively you can also use various read() and write() method from RandomAccessFile e.g readBoolean() , readInt() , readLine() or readUTF() . This is a two part Java IO tutorial, in this part we will learn how to read and write String from RandomAccess file in Java without using Java NIO channels and in next part we will learn how to read bytes using ByteBuffer and Channel API. .

How to Read/Write into Random Access File

In order to write data into random access file, you first need to create an instance of RandomAccessFile class in read and write mode. You can do this by passing «rw» as mode to the constructor. Once you done that you can either use SeekableByteChannel or seek() method to set the pointer to a location where you want to write data. You can either writes bytes using ByteBuffer and Java NIO Channel API or you can write int, float, String or any other Java data type by using respective writeInt() , writeFloat() and writeUTF() methods. All these methods are defined in java.io.RandomAccessFile class in Java IO package. When you write data which exceeds current size of file caused random access file to be extended. For reading data from random access, you can either open the file into read only mode or read write mode. Just like writing, you can also perform reading either by using Channel API and ByteBuffer class ( you should if you are using Java NIO ) or traditional methods defined in RandomAccessFile in Java. Just like you have different write method to write different data types you also have corresponding read methods to read them back. In order to read from a random location, you can use seek() method to set the file pointer to a particular location in file. By the way, if end of file is reached before your program read desired number of bytes, an EOFException will be thrown. If any byte cannot be read due to any other reason then IOException will be thrown.

RandomAccessFile Example in Java

That’s all about how to read and write from RandomAccessFile in Java. You would be surprised that this class is available from JDK 1.0 itself. It is indeed a very useful class from traditional Java IO API, which was only source of doing high speed IO before Java NIO came with memory mapped file.

If you like this Java IO tutorial and hungry for more checkout following tutorials :

  • How to read/write XML file in Java using DOM Parser? (program)
  • How to read text file in Java? (solution)
  • How to check if a file is hidden in Java? (tutorial)
  • How to make JAR file in Java? (steps)
  • How to read Properties file in Java? (program)
  • How to create File and Directory in Java? (solution)
  • How to read File line by line using BufferedReader in Java? (solution)
  • How to write JSON String to file in Java? (solution)
  • How to change File permissions in Java? (program)
  • How to append text to a file in Java? (example)
  • How to parse XML step by step using SAX Parser? (solution)
  • How to copy File in Java? (program)
  • How to upload File in Java web application using Servlets? (demo)
  • Difference between getPath(), getAbsolutePath() and getRelativePath()? (difference)

Further Learning
Complete Java Masterclass
Java Fundamentals: The Java Language
Java In-Depth: Become a Complete Java Engineer!

Библиотека примеров приложений Java

7.17. Произвольный доступ к файлу

Пример демонстрирует использование класса RandomAccessFile для организации прямого доступа к записям, хранящимся в файле.

Немного теории

Библиотека классов Java содержит класс RandomAccessFile, который предназначен для организации прямого доступа к файлам. Он позволяет выполнять операции чтения и записи.

В классе RandomAccessFile определено два конструктора, прототипы которых показаны ниже:

Первый из них позволяет указывать имя файла name, и режим mode, в котором открывается файл. Второй конструктор вместо имени предполагает использование объекта класса File.

Если файл открывается только для чтения, вы должны передать конструктору текстовую строку режима «r». Если же файл открывается и для чтения, и для записи, конструктору передается строка «rw».

Позиционирование внутри файла обеспечивается методом seek, в качестве параметра pos которому передается абсолютное смещение файла:

После вызова этого метода текущая позиция в файле устанавливается в соответствии со значением параметра pos.

В любой момент времени вы можете определить текущую позицию внутри файла, вызвав метод getFilePointer:

С помощью метода close вы должны закрыть файл, после того как работа с ним завершена:

С помощью метода length вы можете определить длину файла в байтах:

Ряд методов предназначен для выполнения как обычного, так и форматированного ввода из файла. Этот набор аналогичен методам, определенным для потоков. Существуют также методы, позволяющие выполнять обычную или форматированную запись в файл с прямым доступом.

Описание примера

В этом разделе мы привели несложный пример автономной программы Java, которая работает с файлом методом прямого доступа. Вначале она создает новый файл и записывает в него десять строк вида «Record 0», «Record 1» и так далее.

Затем программа читает эти строки в обратном порядке и отображает на консоли:

Рассмотрим исходный текст приложения.

Внутри статического метода main, получающего управление при запуске приложения, мы определили несколько переменных.

Переменная i используется как переменная цикла:

В переменной data мы храним ссылку на файл, к которому осуществляется прямой доступ:

Текущая позиция в файле хранится в переменной dataPointer:

Массив idx предназначен для хранения позиций всех записей, добавленных в файл на первом этапе работы приложения:

Строка s используется для временного хранения записей, извлеченных из файла на втором этапе работы приложения:

Все операции, связанные с файлами, могут возбуждать исключения, поэтому мы их выполняем в теле оператора try-catch:

Прежде всего мы создаем файл с именем direct.dat:

Файл открывается для чтения и записи.

Далее мы добавляем в файл десять записей (текстовых строк):

Перед добавлением очередной записи мы получаем текущую позицию в файле, вызывая для этого метод getFilePointer, и сохраняем ее в массиве idx класса Vector. Перед сохранением нам нужно преобразовать тип данных из long в Long, что мы сделали с помощью соответствующего конструктора.

Запись сохраняется методом writeBytes, способным записывать в файл текстовые строки класса String.

На втором этапе добавленные записи читаются в обратном порядке и отображаются на консоли:

Здесь мы вначале извлекаем из массива idx позицию записи с заданным номером и преобразуем ее тип в long.

Далее мы выполняем позиционирование на запись методом seek.

Затем запись читается методом readLine и отображается на консоли.

Может ли RandomAccessFile в java читать весь файл в памяти?

Мне нужно прочитать последние n строк из большого файла (скажем, 2 ГБ). Файл имеет кодировку UTF-8.

Хотелось бы знать, как это сделать наиболее эффективно. Читайте о RandomAccessFile в java, но делает метод seek(), считывает весь файл в памяти. Он использует нативную реализацию, поэтому я не смог сослаться на исходный код.

2 Ответа

RandomAccessFile.seek просто устанавливает текущее положение указателя файла, никакие байты не считываются в память.

Поскольку ваш файл имеет кодировку UTF-8, это текстовый файл. Для чтения текстовых файлов мы обычно используем BufferedReader, Java 7 даже добавили метод convinience File.newBufferedReader для создания экземпляра BufferedReader для чтения текста из файла. Хотя это может быть неэффективно для чтения последних n строк, но легко реализовать.

Чтобы быть эффективными, нам нужно RandomAccessFile и читать файл назад, начиная с конца. Вот простой пример

Он читает файл байт за байтом, начиная с хвоста до ByteArrayOutputStream, когда LF достигается, он меняет местами байты и создает строку.

Необходимо улучшить две вещи:

Если вам нужен случайный доступ, вам нужно RandomAccessFile. Вы можете конвертировать байты, полученные от этого, в UTF-8, если вы знаете, что делаете.

Если вы используете BuffredReader, вы можете использовать skip(n) по количеству символов, что означает, что он должен прочитать весь файл.

Способ сделать это в комбинации; использовать FileInputStream с skip(), найти, откуда вы хотите читать, прочитав назад N новых строк, а затем обернуть поток в BufferedReader, чтобы прочитать строки с кодировкой UTF-8.

Похожие вопросы:

Я использую файлы с отображением памяти в некотором коде Java для быстрой записи в файл 2G. Я сопоставляю весь файл в памяти. Проблема, которую я имею с моим решением, заключается в том, что если.

я использую RandomAccessFile в программе Java на Linux, которая имеет дело с огромным количеством данных. так что я делаю, я храню много файлов, каждый файл содержит разную информацию. когда я.

Я хочу прочитать огромный файл данных (формат csv), содержащий строки и столбцы. Я хочу читать и обрабатывать отдельные столбцы по порядку. Какой метод более эффективен с точки зрения скорости и.

Я относительно новичок в C# и программировании, поэтому, пожалуйста, потерпите меня. Я работаю с приложением, где мне нужно прочитать некоторые файлы и обработать эти файлы в кусках (например.

У меня есть файл байтов 1.5GB в size . Я хочу прочитать весь файл в одном экземпляре экземпляра, похожего на Delphi bytedata:=filebyte.readallbytes(filename); В результате в одном случае.

Я понимаю, как создать файл с отображением памяти, но мой вопрос заключается в том, что в следующей строке: FileChannel roChannel = new RandomAccessFile(file, r).getChannel(); ByteBuffer roBuf =.

У меня есть программа C++, которая использует в какой-то момент hMapFile = OpenFileMapping(dwDesiredAccess, bInheritHandle, lpName); lpName -это что-то вроде myfile без расширений или пути, т. е.

Я изучал java fileoperations, и я пытался прочитать N-й байт как символ в текстовом файле. Я использовал RandomAccessFile (я не уверен, что это правильный модуль для использования здесь), и мой код.

я пытаюсь скопировать простой .данные txt с использованием RandomAccessFile в Java. Я закодировал следующую программу: Мой Основной Метод: public static void main(String args[])< File original = new.

Так что мой сценарий выглядит следующим образом: У меня есть каталог, и каждые X секунд приложение Java опрашивает каталог, чтобы узнать, были ли добавлены какие-либо новые файлы. Если обнаружен.

Читать еще:  System accessibility service
Ссылка на основную публикацию
Adblock
detector