Elettracompany.com

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

Java fileinputstream read

Java FileInputStream tutorial

Java FileInputStream tutorial shows how to use FileInputStream class to read files in Java.

Java FileInputStream

FileInputStream reads input bytes from a file in a file system.

Java FileInputStream constructors

These are FileInputStream constructors:

  • FileInputStream(File file) — creates a file input stream to read from a File object.
  • FileInputStream(String name) — creates a file input stream to read from the specified file name.
  • FileInputStream(FileDescriptor fdObj) — creates a file input read from the specified file descriptor.

Java FileInputStream close

The FileInputStream’s close() method closes the file input stream and releases any system resources associated with this stream. In our examples we use try-with-resources statement, which ensures that each resource is closed at the end of the statement.

Java FileInputStream read

FileInputStream reads bytes with the following read methods :

  • read(byte[] b) — reads up to b.length bytes of data from this input stream into an array of bytes.
  • read(byte[] b, int off, int len) — reads up to len bytes of data from this input stream into an array of bytes.
  • read() — reads one byte from the file input stream.

Java FileInputStream reading characters

The following example uses FileInputStream to read three characters from a file.

The code example reads three characters with read() .

We read a character with read() and cast the value into a char .

The character is printed to the console.

Java FileInputStream reading file by characters

The read() method returns -1 if the end of the file is reached. With a while loop we can read a whole file character by character. Note that this way is not very efficient.

The example reads the contents of a file and writes it to the terminal.

In a while loop we read a character from a FileInputStream until the read() method returns -1.

Java FileInputStream reading file by text chunks

It is more efficient to read a file by data chunks; for instance 1024 bytes in each method call.

In this example we read a file by data chunks

We read data from a file into this array of bytes.

The read() method reads up to b.length bytes of data from this the stream into the provided array of bytes.

From the array of bytes, we create a String .

Java FileInputStream with BufferedReader

Reading is more efficient with BufferedReader . BufferedReader reads text from a character-input stream, buffering characters so as to provide for the efficient reading of characters.

The example reads a big file using buffering technique for greater efficiency.

The readLine() method reads a line of text from a buffer.

Класс InputStream

Базовый класс InputStream представляет классы, которые получают данные из различных источников:

  • массив байтов
  • строка (String)
  • файл
  • канал (pipe): данные помещаются с одного конца и извлекаются с другого
  • последовательность различных потоков, которые можно объединить в одном потоке
  • другие источники (например, подключение к интернету)

Для работы с указанными источниками используются подклассы базового класса InputStream:

BufferedInputStream Буферизированный входной поток ByteArrayInputStream Позволяет использовать буфер в памяти (массив байтов) в качестве источника данных для входного потока. DataInputStream Входной поток, включающий методы для чтения стандартных типов данных Java FileInputStream Для чтения информации из файла FilterInputStream Абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства. InputStream Абстрактный класс, описывающий поток ввода ObjectInputStream Входной поток для объектов StringBufferInputStream Превращает строку (String) во входной поток данных InputStream PipedInputStream Реализует понятие входного канала. PushbackInputStream Входной поток, поддерживающий однобайтовый возврат во входной поток SequenceInputStream Сливает два или более потока InputStream в единый поток

  • int available() — возвращает количество байтов ввода, доступные в данный момент для чтения
  • close() — закрывает источник ввода. Следующие попытки чтения передадут исключение IOException
  • void mark(int readlimit) — помещает метку в текущую точку входного потока, которая остаётся корректной до тех пор, пока не будет прочитано readlimint байт
  • boolean markSupported() — возвращает true, если методы mark() и reset() поддерживаются потоком
  • int read() — возвращает целочисленное представление следующего доступного байта в потоке. При достижении конца файла возвращается значение -1
  • int read(byte[] buffer) — пытается читать байты в буфер, возвращая количество прочитанных байтов. По достижении конца файла возвращает значение -1
  • int read(byte[] buffer, int byteOffset, int byteCount) — пытается читать до byteCount байт в buffer, начиная с смещения byteOffset. По достижении конца файла возвращает -1
  • reset() — сбрасывает входной указатель в ранее установленную метку
  • long skip(long byteCount) — пропускает byteCount байт ввода, возвращая количество проигнорированных байтов

Как преобразовать InputStream в строку

  1. Using IOUtils.toString (Apache Utils):
  2. Using CharStreams (guava)
  3. Using Scanner (JDK)
    символ «А» является символом начала текста, таким образом вызов next() вернет сразу всю строку.
  4. Using Stream Api (Java 8). Warning: This solution convert different linebreaks (like rn) to n.
  5. Using parallel Stream Api (Java 8). Warning: This solution convert different linebreaks (like rn) to n.
  6. Using InputStreamReader and StringBuilder (JDK)
  7. Using StringWriter and IOUtils.copy (Apache Commons)
  8. Using ByteArrayOutputStream and inputStream.read (JDK)
  9. Using BufferedReader (JDK). Warning: This solution convert different linebreaks (like nr) to line.separator system property (for example, in Windows to «rn»).
  10. Using BufferedInputStream and ByteArrayOutputStream (JDK)
  11. Using inputStream.read() and StringBuilder (JDK). Warning: This soulition has problem with Unicode, for example with Russian text (work correctly only with non-Unicode text)
Читать еще:  Arraylist set java

Warning:
Solutions 4, 5 and 9 convert different linebreaks to one.
Soulution 11 can’t work correclty with Unicode text

BufferedInputStream

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

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

ByteArrayInputStream

Класс ByteArrayInputStream использует байтовый массив в качестве источника данных. У данного класса можно не вызывать метод close().

DataInputStream — Форматированное чтение из памяти

Для чтения байтовых данных (не строк) применяется класс DataInputStream. В этом случае необходимо использовать классы из группы InputStream.

Для преобразования строки в массив байтов, пригодный для помещения в поток ByteArrayInputStream, в классе String предусмотрен метод getBytes(). Полученный ByteArrayInputStream представляет собой поток InputStream, подходящий для передачи DataInputStream.

При побайтовом чтении символов из форматированного потока DataInputStream методом readByte() любое полученное значение будет считаться действительным, поэтому возвращаемое значение неприменимо для идентификации конца потока. Вместо этого можно использовать метод available(), который сообщает, сколько еще осталось символов.

Класс DataInputStream позволяет читать элементарные данные из потока через интерфейс DataInput, который определяет методы, преобразующие элементарные значения в форму последовательности байтов. Такие потоки облегчают сохранение в файле двоичных данных.

FileInputStream

Класс FileInputStream создаёт объект класса InputStream, который можно использовать для чтения байтов из файла.

  • FileInputStream (File file) — указывается объекта типа File
  • FileInputStream (FileDescriptor fd)
  • FileInputStream (String path) — указывается полное имя файла

При создании объект открывается для чтения. Класс переопределяет методы класса InputStream, кроме методов mark() и reset().

Для чтения байтов входного потока из файла используется конструкция:

PushbackInputStream

Разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток. Класс PushbackInputStream представляет механизм «заглянуть» во входной поток и увидеть, что оттуда поступит в следующий раз, не извлекая информации.

У класса есть дополнительный метод unread().

SequenceInputStream

Класс SequenceInputStream позволяет соединять вместе несколько экземпляров класса InputStream. Конструктор принимает в качестве аргумента либо пару объектов класса InputStream, либо интерфейс Enumeration.

Во время работы класс выполняет запросы на чтение из первого объекта класса InputStream и до конца, а затем переключается на второй. При использовании интерфейса работа продолжится по всем объектам класса InputStream. По достижении конца каждого файла, связанный с ним поток закрывается. Закрытие потока, созданного объектом класса SequenceInputStream, приводит к закрытию всех открытых потоков.

Потоки ввода, InputStream

Существуют две параллельные иерархии классов ввода : InputStream и Reader. Класс Reader введен в последних версиях Java. В данной статье рассматривается вопрос использования потока байтового ввода InputStream, иерархия которого представлена на следующем рисунке.

Поток Stream— это абстрактное понятие источника или приёмника данных, которые способны обрабатывать информацию. Есть два типа потоков: байтовые и символьные. В некоторых ситуациях символьные потоки более эффективны, чем байтовые. Классы, производные от базовых InputStream или Reader, имеют методы read() для чтения отдельных байтов или массива байтов.

Входной поток InputStream

Базовый класс InputStream — это абстрактный класс, определяющий входной поток данных, и является родителем для классов, получающих данные из различных источников : массив байтов, строки (String), файлы, каналы pipe, у которых одна из сторон является входом, а вторая сторона играет роль выхода, и т.д. Методы класса InputStream при возникновении ошибки вызывают исключение IOException.

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

Класс InputStream часто выступает в качестве параметров конструкторов или методов различных классов. Согласно правилам наследования это означает, что в качестве параметра может быть передан объект любого класса-наследника. Это позволяет комбинировать классы для достижения нужных нам целей.

ByteArrayInputStream

Класс ByteArrayInputStream использует байтовый массив в качестве источника данных. Он имеет следующие конструкторы :

В качестве параметров конструкторы ByteArrayInputStream используют массив байтов buf для чтения, смещение относительно начала массива offset и количество считываемых символов length.

Читать еще:  Java string matches regex

Пример чтения массив байтов в консоль:

В отличие от других классов потоков для закрытия объекта ByteArrayInputStream не требует вызывать метод close.

FileInputStream

FileInputStream — основной класс из данной иерархии для работы с файлами. Имеет два основных конструктора.

Подробно FileInputStream описан на странице Файлы и директории

FilterInputStream

FilterInputStream — абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства. FilterInputStream является базовым классом для двух других классов. Его единственный конструктор требует передачи в качестве параметра объекта класса InputStream, т.е. фактически объекта некоторого неабстрактного класса, порожденного от InputStream.

Прямое использование FilterInputStream в программе нецелесообразно.

BufferedInputStream

BufferedInputStream служит для организации более эффективного «буферизованного» ввода данных. Буферизация ввода-вывода является удобным способом оптимизации производительности, позволяя заключить в оболочку любой поток класса InputStream.

В конструкторе класса BufferedInputStream необходимо передать InputStream. В данном случае таким объектом является экземпляр класса ByteArrayInputStream.

Как и все потоки ввода BufferedInputStream обладает методом read(), который считывает данные с помощью метода read из массива buffer.

Фактические все то же самое можно было сделать и с помощью одного ByteArrayInputStream, не прибегая к буферизированному потоку. Класс BufferedInputStream просто оптимизирует производительность при работе с потоком ByteArrayInputStream.

DataInputStream

Для чтения байтовых данных (не строк) применяется класс DataInputStream. В этом случае необходимо использовать классы из группы InputStream. Для преобразования строки в массив байтов, пригодный для помещения в поток ByteArrayInputStream, в классе String предусмотрен метод getBytes(). Полученный ByteArrayInputStream представляет собой поток InputStream, подходящий для передачи DataInputStream.

При побайтовом чтении символов из форматированного потока DataInputStream методом readByte() любое полученное значение будет считаться действительным, поэтому возвращаемое значение неприменимо для идентификации конца потока. Вместо этого можно использовать метод available(), который сообщает, сколько еще осталось символов.

Класс DataInputStream позволяет читать элементарные данные из потока через интерфейс DataInput, который определяет методы, преобразующие элементарные значения в форму последовательности байтов. Такие потоки облегчают сохранение в файле двоичных данных.

Класс Java.io.FileInputStream в Java

FileInputStream полезен для чтения данных из файла в виде последовательности байтов. FileInputStream предназначен для чтения потоков необработанных байтов, таких как данные изображения. Для чтения потоков символов рассмотрите использование FileReader.

Конструктор и описание

  • FileInputStream (File file): создает поток входного файла для чтения из указанного объекта File.
  • FileInputStream (FileDescriptor fdobj): создает поток входного файла для чтения из указанного дескриптора файла.
  • FileInputStream (String name): создает поток входного файла для чтения из файла с указанным именем.

Важные методы:

  • int read (): читает байт данных из этого входного потока.
  • int read (byte [] b): читает байты данных длиной до b.length из этого входного потока в массив байтов.
  • int read (byte [] b, int off, int len): считывает до байтов данных из этого входного потока в массив байтов.
  • long skip (long n): пропускает и отбрасывает n байтов данных из входного потока.
  • int available (): возвращает оценку количества оставшихся байтов, которые могут быть прочитаны (или пропущены) из этого входного потока.
  • void close (): закрывает этот поток ввода файла и освобождает все системные ресурсы, связанные с потоком.
  • FileDescriptor getFD (): возвращает объект FileDescriptor, который представляет соединение с фактическим файлом в файловой системе, используемой этим FileInputStream.
  • FileChannel getChannel (): Возвращает уникальный объект FileChannel, связанный с этим потоком ввода файла.
  • void finalize (): Гарантирует, что метод close этого потока ввода файла вызывается, когда на него больше нет ссылок.

Шаги для чтения данных из файла с использованием FileInputStream

  • Сначала прикрепите файл к FileInputStream, как показано здесь:
  • Это позволит нам читать данные из файла. Затем, чтобы прочитать данные из файла, мы должны прочитать данные из FileInputStream как;

Когда больше нет данных для дальнейшего чтения, метод read () возвращает -1;

  • Затем мы должны подключить монитор к выходному потоку. Для отображения данных мы можем использовать System.out.print.
  • Реализация:

    // Java-программа, демонстрирующая FileInputStream

    public static void main(String args[]) throws IOException

    // прикрепляем файл к FileInputStream

    FileInputStream fin= new FileInputStream( «file1.txt» );

    // иллюстрируем метод getChannel ()

    // иллюстрирующий метод getFD ()

    // иллюстрирующий доступный метод

    System.out.println( «Number of remaining bytes:» +fin.available());

    // иллюстрирующий метод пропуска

    / * Исходное содержимое файла:

    * Это моя первая строчка

    * Это моя вторая строчка * /

    // читаем символы из FileInputStream и пишем их

    while ((ch=fin.read())!=- 1 )

    System.out.print(( char )ch);

    Выход:

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

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

    Читать еще:  Работа с бд java

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

    sadafnoor

    Just another WordPress.com site

    [java] FileInputStream and Reading line by line:

    The computer that we are using right now is digital electronic, it is digital because all the information inside it is represented by streams of numbers, more specifically binary numbers. From the perspective of Computer every single file is nothing but a stream of binary numbers. Still now sometimes i stare at my computer and think what not we are making it to do so but it knows nothing more than 0 and 1? WTF! (Well, That’s Fantastic!)

    Before dealing with FileInputStream first of all we have to know what FileInputStream really is.

    FileInputIstream is basically a child class of InputStream. It obtains input bytes from a file in a file system. Stream classes basically deal with binary datas and in binary there is no such thing as a “line” so FileInputStream does not have any method which is related with lines.

    Our objective is to read from a file line by line using FileInputStream.

    First of all it’s in a different not included in java.lang package so if we will use FileInputStream we need to import java.io.* at the beginning of the class.

    Scanner or BufferedReader has methods to work with lines so if we can can somehow scan/read Streams through Scanneror BufferedReader, then we can read them line by line using nextLine() or readLine() method.

    Scanner does give us opportunity to pass a InputStream through its constructor.

    Now, we need to think of a way to make an connection our given file and java.

    From the summary of the constructor of FileInputStream, we can easily guess at least two way to make this linkage through the constractor:

    1. FileInputStream(String name): i think this is the most straight forward way to do this thing. If the file we want to read and our file which we want to to read line by line are at the same directory then we can just write that files name and extension as name constractor and as this constractor throws FileNotFoundException so we also need to handle that exception.

    Example: if we want to read a file named “sample.txt” then we would write:

    try <
    FileInputStream fileInStreamObj = new FileInputStream(«sample.txt» );
    >
    catch (FileNotFoundException e) <
    System.out.println(e);
    >

    But if file which we want to to read line by line are not at the same directory then we have to write that files directory briefly and we have to use double ‘//’ in place of single ‘/’ (FYI: as ‘/’ is a escape character and you can’t store a single ‘/’ in a character veritable). Example: if we want to read a file named “sample.txt” which is located at the directory of “C:Documents and SettingsUserDesktopsample.txt”, then you have to write:

    FileInputStream fileInStreamObj = new FileInputStream(«C:\Documents and Settings\User\Desktop\sample.txt» );

    try blocks confines the scope of variables, so we can put this previous piece of code inside same try block.

    Combinig all the pieces:

    import java.io.*;
    import java.util.Scanner;
    public class ReadALineUsingFileInputStream <
    public static void main (String [] args) <
    try <
    FileInputStream fileInStreamObj = new FileInputStream(«sample.txt» );
    InputStream inStreamObject = ((InputStream) fileInStreamObj);
    Scanner sc = new Scanner( inStreamObject );
    String input = sc.nextLine();
    System.out.println(input);
    >
    catch (FileNotFoundException e) <
    System.out.println(e);
    >
    >
    >

    2. FileInputStream(File file): If we want to use this contractor, first of all we need to define file location with an object of File and then let it go through with FileInputStream‘s constractor and this constractor also throws FileNotFoundException so we also need to handle that exception.:

    try <
    File fileObject = new File(«sample.txt» );
    FileInputStream fileInStreamObj = new FileInputStream(fileObject);
    >
    catch (FileNotFoundException e) <
    System.out.println(e);
    >

    Now we need to convert this FileInputStream into InputStream, but they are in the same tree so we can cast them. So here we go:

    InputStream inStreamObject = (InputStream) fileInStreamObj
    Scanner sc = new Scanner( inStreamObject );
    String input = sc.nextLine();

    combining all peaces:

    import java.io.*;
    import java.util.Scanner;
    public class ReadALineUsingFileInputStream <
    public static void main (String [] args) <
    try <
    File fileObject = new File(«sample.txt» );
    FileInputStream fileInStreamObj = new FileInputStream(fileObject);
    InputStream inStreamObject = (InputStream) fileInStreamObj;
    Scanner sc = new Scanner( inStreamObject );
    String input = sc.nextLine();
    System.out.println(input);
    >
    catch (FileNotFoundException e) <
    System.out.println(e);
    >
    >
    >

    we can also do similar thing using BufferedReader:

    Ссылка на основную публикацию
    Adblock
    detector