Урок 19

Байтовые потоки


1. Класс InputStream

Класс InputStream – это абстрактный класс. Все байтовые потоки чтения наследуются от класса InputStream.

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

Существует 3 основных read()-метода:

  • int read() - возвращает целочисленное представление следующего доступного байта в потоке. При достижении конца файла возвращается значение -1.
  • int read(byte[] buffer) - пытается прочесть максимум buffer.length байт из входного потока в массив buffer. Возвращает количество байт, в действительности прочитанных из потока. По достижении конца файла возвращает значение -1.
  • int read(byte[] buffer, int offset, int length) - пытается прочесть максимум length байт, расположив их в массиве buffer, начиная с элемента offset. Возвращает количество реально прочитанных байт. По достижении конца файла возвращает -1.

Методы read() будут блокированы, пока доступные данные не будут прочитаны. 

  • int available() - возвращает количество байтов ввода, доступные в данный момент для чтения.
  • close() - закрывает источник ввода. Следующие попытки чтения передадут исключение IOException.
  • long skip(long byteCount) - пропускает byteCount байт ввода, возвращая количество проигнорированных байтов.

Все методы выбрасывают исключение IOException, если происходит ошибка ввода-вывода. 

2. Класс OutputStream

Все байтовые потоки записи наследуются от абстрактного класса OutputStream.

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

Существуют 3 основных write()-метода:

  • void write(int data) - записывает один байт в выходной поток. Аргумент этого метода имеет тип int, что позволяет вызывать write, передавая ему выражение, при этом не нужно выполнять приведение его типа к byte, 0 <= data <= 255.
  • void write(byte[] buffer) - записывает в выходной поток весь указанный массив байт.
  • void write(byte[] buffer, int offset, int length) - записывает в поток часть массива - length байт, начиная с элемента buffer[offset].
  • flush() - очищает любые выходные буферы, завершая операцию вывода.
  • close() - закрывает выходной поток. Последующие попытки записи в этот поток будут возбуждать IOException.

Методы выбрасывают исключение IOException, если происходит ошибка ввода-вывода.

3. Класс FileInputStream

Поток FileInputStream используется в Java для чтения данных из файла.

Конструкторы класса FileInputStream:

InputStream a = new FileInputStream("D:/myprogramm/java/test.txt"); 

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

File file = new File("D:/myprogramm/java/test.txt");
InputStream a = new FileInputStream(file);

 Этот конструктор использует объектный файл с целью создания объекта входного потока для чтения файла.

4. Класс FileOutputStream

В Javа FileOutputStream используется для создания файла и последующей записи в него. Поток создаст файл в случае его отсутствия перед его открытием для вывода.

Конструкторы класса FileOutputStream:

OutputStream outputStream = new FileOutputStream("D:/myprogramm/java/test.txt");

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

File file = new File("D:/myprogramm/java/test.txt"); 
OutputStream a = new FileOutputStream(file);

Этот конструктор использует объектный файл с целью создания объекта выходного потока для записи файла.

Пример 1. Использование FileInputStream и FileOutputStream

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {
    public static void main(String[] args) throws IOException {
        FileInputStream fileIn = null;
        FileOutputStream fileOut = null;

        try {
            fileIn = new FileInputStream("src\\io\\file.txt");
            fileOut = new FileOutputStream("src\\io\\copied_file.txt");

            int a;
            // Копирование содержимого файла file.txt
            while ((a = fileIn.read()) != -1) {
                // Чтение содержимого файла file.txt и запись в copied_file.txt
                fileOut.write(a);
            }
        } finally {
            if (fileIn != null) {
                fileIn.close();
            }
            if (fileOut != null) {
                fileOut.close();
            }
        }
    }
}

Пример 2. Использование FileInputStream и FileOutputStream

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;

public class FileInputOutputStreamDemo {
    public static void main(String[] args) {
        try {
            char[] c = {'a', 'b', 'c'};
            // Создание текстового файла
            OutputStream output = new FileOutputStream("a.txt");
            for (int i = 0; i < c.length; i++) {
                // Запись каждого символа в текстовый файл
                output.write(c[i]);
            }
            output.close();

            InputStream input = new FileInputStream("a.txt");
            int size = input.available();

            for (int j = 0; j < size; j++) {
                // Чтение текстового файла посимвольно
                System.out.print((char) input.read() + " ");
            }
            input.close();
        } catch (IOException e) {
            System.out.print("Exception");
        }
    }
}

5. Классы байтовых потоков

Класс Назначение
BufferedlnputStream Буферизированный входной поток.
BufferedOutputStream Буферизированный выходной поток.
ByteArraylnputStream Входной поток, читающий из массива байт.
ByteArrayOutputStream Выходной поток, записывающий в массив байт.
DatalnputStream Входной поток, включающий методы для чтения стандартных типов  данных Java.
DataOutputStream Выходной поток, включающий методы для записи стандартных типов данных Java.
FilelnputStream Входной поток, читающий из файла.
FileOutputStream Выходной поток, записывающий в файл.
FilterlnputStream Реализация InputStream.
FilterOutputStream Реализация OutputStream.
ObjectlnputStream Входной поток для объектов.
ObjectOutputStream Выходной поток для объектов.
OutputStream Абстрактный класс, описывающий поток вывода.
PipedlnputStream Входной канал (например, межпрограммный).
PipedOutputStream Выходной канал.
PrintStream Выходной поток, включающий print() и println().
PushbacklnputStream Входной поток, реализующий операцию pushback (вернуть назад).
RandomAccessFile Позволяет перемещаться по файлу, читать из него или писать в него.
SequencelnputStream Входной поток, представляющий собой комбинацию двух и более входных потоков, которые читаются совместно  один после другого.


0 comments
Leave your comment: