Файл: Что такое потоки вводавывода Как это реализовано в Java Что делает метод read.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.03.2024

Просмотров: 14

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

  • Что такое потоки ввода-вывода? Как это реализовано в Java?

  • Что делает метод read?

  • Что такое System.in, что такое System.out?

  • Что делает flush? Почему важно закрывать потоки?

  • Расскажи про классы Reader и Writer?

  • Как преобразовать считанные байты в символы? Какой класс для этого используется?

  • Отличие Scanner’a от BufferedReader’a?

  • Отличие пакета io от nio?

  • Расскажи про класс File? Как создать новый файл на жестком диске?

  • В чём отличие File от Path?

  • В чем разница между абсолютным и относительным путем?

  • Что такое клонирование? Как реализовано клонирование в Java?

  • Как удалить директорию с файлами?

  • В чём разница между поверхностным и глубоким клонированием? Как реализовать глубокое клонирование?

  • Что такое сериализация и десериализация?

  • Назовите несколько форматов сериализации.

  • Какие поля не сериализуются?

  • Как сериализовать статическое поле?

Что такое потоки ввода-вывода? Как это реализовано в Java?

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

Ключевым понятием здесь является понятие потока. Хотя понятие "поток" в программировании довольно перегружено и может обозначать множество различных концепций. В данном случае применительно к работе с файлами и вводом-выводом мы будем говорить о потоке (stream), как об абстракции, которая используется для чтения или записи информации (файлов, сокетов, текста консоли и т.д.).

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

Объект, из которого можно считать данные, называется потоком ввода, а объект, в который можно записывать данные, - потоком вывода. Например, если надо считать содержание файла, то применяется поток ввода, а если надо записать в файл - то поток вывода.

В основе всех классов, управляющих потоками байтов, находятся два абстрактных класса: InputStream (представляющий потоки ввода) и OutputStream (представляющий потоки вывода)


Но поскольку работать с байтами не очень удобно, то для работы с потоками символов были добавлены абстрактные классы Reader (для чтения потоков символов) и Writer (для записи потоков символов).

Все остальные классы, работающие с потоками, являются наследниками этих абстрактных классов. Основные классы потоков:



  • Что делает метод read?

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

Метод read() класса InputStream считывает байт данных из входного потока. Возвращается следующий байт данных или -1, если достигнут конец файла, и генерирует исключение, если возникает ошибка ввода-вывода. Обратитесь к программе.

Синтаксис:

public abstract int read()

Возвращаемое значение: этот метод возвращает следующий байт данных или -1, если достигнут конец потока.

  • Что такое System.out_и_System.err'>System.in, что такое System.out?

Операции File IO с помощью класса System


Класс System содержит три поля — in, out и err. Они используются для чтения данных из InputStream и записи данных в OutputStream. Например, мы можем установить FileOutputStream к полю out и err для того, чтобы результат вывода в консоль записывался в файл.

Стандартная модель ввода/вывода в Java имеет System.in, System.out и System.err. На протяжении всей этой книге вы видели, как писать в стандартный вывод, используя System.out, который представляет собой объект PrintStream. System.err аналогичен PrintStream, а System.in является производной InputStream без каких-либо включений. Это означает, что в то время, когда вы можете использовать System.out и System.err как они есть, System.in должен куда-то включаться (быть обернут), прежде, чем вы сможете прочесть из него.

  • Что делает flush? Почему важно закрывать потоки?

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



  • Расскажи про классы Reader и Writer?

Абстрактный класс Reader предоставляет функционал для чтения текстовой информации. Рассмотрим его основные методы:

  • absract void close(): закрывает поток ввода

  • int read(): возвращает целочисленное представление следующего символа в потоке. Если таких символов нет, и достигнут конец файла, то возвращается число -1

  • int read(char[] buffer): считывает в массив buffer из потока символы, количество которых равно длине массива buffer. Возвращает количество успешно считанных символов. При достижении конца файла возвращает -1

  • int read(CharBuffer buffer): считывает в объект CharBuffer из потока символы. Возвращает количество успешно считанных символов. При достижении конца файла возвращает -1

  • absract int read(char[] buffer, int offset, int count): считывает в массив buffer, начиная со смещения offset, из потока символы, количество которых равно count

  • long skip(long count): пропускает количество символов, равное count. Возвращает число успешно пропущенных символов

Класс Writer определяет функционал для всех символьных потоков вывода. Его основные методы:

  • Writer append(char c): добавляет в конец выходного потока символ c. Возвращает объект Writer

  • Writer append(CharSequence chars): добавляет в конец выходного потока набор символов chars. Возвращает объект Writer

  • abstract void close(): закрывает поток

  • abstract void flush(): очищает буферы потока

  • void write(int c): записывает в поток один символ, который имеет целочисленное представление

  • void write(char[] buffer): записывает в поток массив символов

  • absract void write(char[] buffer, int off, int len) : записывает в поток только несколько символов из массива buffer. Причем количество символов равно len, а отбор символов из массива начинается с индекса off

  • void write(String str): записывает в поток строку

  • void write(String str, int off, int len): записывает в поток из строки некоторое количество символов, которое равно len, причем отбор символов из строки начинается с индекса off

Функционал, описанный классами Reader и Writer, наследуется непосредственно классами символьных потоков, в частности классами FileReader и FileWriter соответственно, предназначенными для работы с текстовыми файлами.

  • Как преобразовать считанные байты в символы? Какой класс для этого используется?

OutputStreamWriter — «мост» между классом OutputStream и классом Writer. Символы, записанные в поток, преобразовываются в байты.

InputStreamReader — аналог для чтения. При помощи методов класса Reader читаются байты из потока InputStream и далее преобразуются в символы.


  • Отличие Scanner’a от BufferedReader’a?

BufferedReader работает синхронно, а Scanner — нет. BufferedReader следует использовать, если мы работаем с несколькими потоками.

BufferedReader имеет значительно большую буферную память, чем Scanner.

Сканер имеет небольшой буфер (1KB буфер символов) в отличие от BufferedReader (8KB байтовый буфер), но этого более чем достаточно.

  • Отличие пакета io от nio?

Основное отличие IO от NIO в том, что IO, а NIO буферо-ориентированным. Потокоориентированный ввод/вывод подразумевает чтение/запись из потока/в поток одного или нескольких байт в единицу времени поочередно. Подход, на котором основан Java NIO немного отличается. Данные считываются в буфер для последующей обработки. Блокирующий и неблокирующий ввод/вывод. Потоки ввода/вывода (streams) в Java IO являются блокирующими.

  • Расскажи про класс File? Как создать новый файл на жестком диске?

Класс File, определенный в пакете java.io, не работает напрямую с потоками. Его задачей является управление информацией о файлах и каталогах. Хотя на уровне операционной системы файлы и каталоги отличаются, но в Java они описываются одним классом File.

В зависимости от того, что должен представлять объект File - файл или каталог, мы можем использовать один из конструкторов для создания объекта:

Класс File имеет ряд методов, которые позволяют управлять файлами и каталогами. Рассмотрим некоторые из них:

boolean createNewFile(): создает новый файл по пути, который передан в конструктор. В случае удачного создания возвращает true, иначе false

boolean delete(): удаляет каталог или файл по пути, который передан в конструктор. При удачном удалении возвращает true.

boolean exists(): проверяет, существует ли по указанному в конструкторе пути файл или каталог. И если файл или каталог существует, то возвращает true, иначе возвращает false

String getAbsolutePath(): возвращает абсолютный путь для пути, переданного в конструктор объекта

String getName(): возвращает краткое имя файла или каталога

String getParent(): возвращает имя родительского каталога

boolean isDirectory(): возвращает значение true, если по указанному пути располагается каталог

boolean isFile(): возвращает значение true, если по указанному пути находится файл

boolean isHidden(): возвращает значение true, если каталог или файл являются скрытыми

long length(): возвращает размер файла в байтах


long lastModified(): возвращает время последнего изменения файла или каталога. Значение представляет количество миллисекунд, прошедших с начала эпохи Unix

String[] list(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге

File[] listFiles(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге

boolean mkdir(): создает новый каталог и при удачном создании возвращает значение true

boolean renameTo(File dest): переименовывает файл или каталог

  • В чём отличие File от Path?

Path

Path, по большому счету, — это переработанный аналог класса File. Работать с ним значительно проще, чем с File.

Во-первых, из него убрали многие утилитные (статические) методы, и перенесли их в класс Files.

Во-вторых, в Path были упорядочены возвращаемые значения методов. В классе File методы возвращали то String, то boolean, то File — разобраться было непросто.

Например, был метод getParent(), который возвращал родительский путь для текущего файла в виде строки. Но при этом был метод getParentFile(), который возвращал то же самое, но в виде объекта File!

Это явно избыточно. Поэтому в интерфейсе Path метод getParent() и другие методы работы с файлами возвращают просто объект Path. Никакой кучи вариантов — все легко и просто.

Какие же полезные методы есть у Path?

Вот некоторые из них и примеры их работы:

getFileName() — возвращает имя файла из пути;

getParent() — возвращает «родительскую» директорию по отношению к текущему пути (то есть ту директорию, которая находится выше по дереву каталогов);

getRoot() — возвращает «корневую» директорию; то есть ту, которая находится на вершине дерева каталогов;

startsWith(), endsWith() — проверяют, начинается/заканчивается ли путь с переданного пути

  • В чем разница между абсолютным и относительным путем?

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

И операционная система, и браузер, встретив относительный путь, достраивают его до абсолютного. но каждый - по-своему.

  • Что такое клонирование? Как реализовано клонирование в Java?

Создание экземпляра класса с теми же значениями полей и теми же методами