Главная страница

Что такое потоки ввода-вывода 5 - (). Что такое потоки вводавывода Как это реализовано в Java


Скачать 16.58 Kb.
НазваниеЧто такое потоки вводавывода Как это реализовано в Java
Дата27.10.2022
Размер16.58 Kb.
Формат файлаdocx
Имя файлаЧто такое потоки ввода-вывода 5 - ().docx
ТипДокументы
#758559

Что такое потоки ввода-вывода? Как это реализовано в Java?
Объект, из которого можно считать данные, называется потоком ввода,

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

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

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

Метод читает следующий байт из входящего потока. Когда метод ничего не может считать (конец потока), возвращается -1. Возвращает int (целочисленное значение этого byte)
Почему он возвращает int а не byte?

Потому что нужно нужен такой тип, который может вместить 1 байт, плюс одно служебное значение -1 (обозначающее конец потока). Диапазон byte в Java лежит от -128 до 127, а возвращаемое значение метода read() лежит в диапазоне от 0 до 255.
Что вернет метод read(), если он считывает файл и ему встречается байт равный -1?

255

-2?

254
Перегруженный метод read() – что принимает? Что возвращает?

Принимает массив byte[], возвращает int (количество считанных байтов)
На каком паттерне основана иерархия потоков ввода/вывода

В паттерне «Декоратор»

предоставляют гибкую альтернативу подклассам для расширения функциональности.

позволяет динамически изменять поведение объекта во время выполнения, оборачивая их в объект класса декоратора.


Что такое System.in и System.out?

Стандартные потоки ввода вывода

In – InputStream

Out – PrintStream

Чем они являются в классе System?

Статическими полями
Что делает метод flush?

flush() - записывает содержимое буфера в пункт назначения и делает буфер пустым для хранения дополнительных данных

Вызов метода flush() гарантирует только то, что байты, ранее записанные в поток, передаются операционной системе для записи, но не гарантирует записи на диск.
Выполнится ли flush если мы сделаем close у потока?

Если вы хотите, чтобы поток был сброшен, да, вызовите flush() перед вызовом close()

Да, выполнится
Почему важно закрывать потоки?

Чтобы предотвратить утечку памяти и/или ресурсов

Как преобразовать считанные байты в символы?

Какой класс для этого используется?

InputStreamReader;

Массив можно преобразовать обратно в строку с помощью конструктора new String(byte[]);

Метод getBytes(charsetName) класса String – преобразование char в byte.

Отличие Scanner’a от BufferedReader’a?
Класс BufferedReader, являющийся надстройкой над Reader, имеет один очень удобный метод: readLine(). Этот метод позволяет читать из Reader-а сразу целыми строками (т.е. линиями). Когда ты в своем коде вызываешь метод readLine, он читает из объекта Reader символы, пока не встретится enter. Как только enter встретится, метод склеит символы в одну строку и вернет ее.
Класс Scanner используется для получения (считывания) данных введенных пользователем в виде String, byte, short, int, long, float, double. Сканер выполняет поиск токенов во входной строке.

Токен (или маркер) представляет собой серию цифровых или буквенно-цифровых символов, которая заканчивается разделителем. Разделителем может быть символ табуляции, Enter, конец файла или пробел.
Что можешь сказать про буфер каждого?

BufferedReader – 8 КБ

Scanner – он неявный, но он есть. 1 КБ.

Кто из них синхронизированный?

BufferedReader

Что быстрее?

BufferedReader
Отличие Scanner от BufferedReader

Scanner неявно создает буфер, т.к. основан на интерфейсе Readable - и единственный метод в этом интерфейсе основан на буфере.

Scanner работает медленно, но зато предоставляет очень широкий API с кучей удобных методов,
а BufferedReader работает быстрее, потому что читает часть входных данных из буфера, откуда они быстрее читаются по частям, то есть обращение к консоли происходит реже.


Расскажите про пакеты IO и NIO
Java IO (input-output) является потоком ориентированным, а Java NIO (new/non-blocking io) – буфер-ориентированным.

Поток Ориентированный ввод/вывод подразумевает чтение/запись из потока/в поток одного или нескольких байт в единицу времени поочередно. Данная информация нигде не кэшируются. Таким образом, невозможно произвольно двигаться по потоку данных вперед или назад.

В Java NIO данные сначала считываются в буфер, что дает больше гибкости при обработке данных.

Расскажите про класс File. Зачем он нужен?

Класс File работает не с потоками, а непосредственно с файлами. Данный класс позволяет получить информацию о файле: права доступа, время и дата создания, путь к каталогу. А также осуществлять навигацию по иерархиям подкаталогов. Класс java.io.File может представлять имя определённого файла, а также имена группы файлов, находящихся в каталоге.
Как создать файл на жестком диске с помощью класса File?

С помощью метода createNewFile()
Что возвращает метод createNewFile()?

True – если файл создан успешно, false – не успешно
Какие есть методы у класса File, чтобы создать директории?

Mkdir – создает одну директорию

Mkdirs – создает директории по иерархии
Как удалить директорию?

Метод delete(), удалит только если директория пуста. Если директория не пуста написать рекурсивный обход для удаления всех файлов, а потом удалить директорию.
Что такое канонический,абсолютный, относительный путь?

Абсолютный – путь до файла начиная с корня диска

Относительный – пусть относительно папки проекта Java

канонический - это тот путь, который будет максимально простым и строгим. "каноничным". То есть, без всех этих странных конструкций

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


File — это класс, Path — это интерфейс.
File — это старый способ доступа к файловой системе,

Path — это новый рекомендуемый способ.
Path допускает работу с файлами на виртуальных файловых системах,

а File нет.
Path при ошибках ввода-вывода бросают исключения;

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

Работать с ним значительно проще, чем с File.
Во-первых, из него убрали многие утилитные (статические) методы, и перенесли их в класс File.
Во-вторых, в Path были упорядочены возвращаемые значения методов.
getFileName() — возвращает имя файла из пути;

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

Что такое клонирование?

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

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

Метод clone() объекта обеспечивает поверхностное клонирование. В этом механизме клонирования объект копируется без содержащихся в нем объектов.

Клон копирует только структуру верхнего уровня объекта, а не нижние уровни.

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

Глубокое с примитивными и ссылочными.

Чем отличается клонирование от копирования?

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

При копировании создается новый объект, но ссылка с первого объекта переходит на этот новый объект
Назовите способы клонирования

  • Переопределение метода clone() и реализация интерфейса Cloneable().

  • Использование конструктора копирования. Создается конструктор, принимающий на вход объект того же класса, который необходимо клонировать.

  • Использовать для клонирования механизм сериализации.



Можно ли клонировать String, массив String?

Класс String не реализует интерфейс Cloneable.

Класс String представляет не изменяемую строку. Нет смысла клонировать String. Если вы чувствуете, что вам нужно клонировать его, вы можете просто повторно использовать ту же ссылку и добиться того же эффекта.

Даже если бы вы могли clone s1 как s2, тогда s1 != s2 все равно был бы true. Они по-прежнему будут ссылками на отдельные объекты.

можно клонировать массив string

Метод clone() копирует каждый строковый объект в массиве в новый объект массива, содержащий совершенно новые строковые объекты

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

Сериализация это процесс сохранения состояния объекта в последовательность байт;

де сериализация это процесс восстановления объекта, из этих байт.
Для чего нужна сериализация

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

Чтобы обладать способностью к сериализации, класс должен реализовывать интерфейс-метку Serializable. Так же все атрибуты и подтипы сериализуемого класса должны быть сериализуемым. Если класс предок был

не сериализуемым, то этот супер класс должен содержать доступный (public, protected) конструктор без параметров для инициализации полей.
Какие поля не сериализуются?

При стандартной сериализации поля, имеющие модификатор static, transient не

сериализуются. Соответственно, после десериализации это поле значения не меняет.
Как сериализовать объект класса

Нужно пометить его маркерным классом Serializable.
Какие форматы сериализации существуют

JSON;

JavaScript Object Notation;

XML;

BinarySON - тот же JSON только в двоичном представлении;

YAML - Yet Another Markup Language;
Как сериализовать статическое поле

При стандартной сериализации поля, имеющие модификатор static, не сериализуются. Соответственно, после десериализации это поле значения не меняет. При использовании реализации Externalizable сериализовать и десериализовать статическое поле можно, но не рекомендуется этого делать, т.к. это может сопровождаться трудно уловимыми ошибками.

Можно ли сериализовать final поле

Поля с модификатором final сериализуются как и обычные. За одним исключением - их невозможно десериализовать при использовании
Externalizable, поскольку final-поля должны быть инициализированы в конструкторе, а после этого в readExternal изменить значение этого поля будет невозможно. Соответственно, если необходимо сериализовать объект с final-полем, то нужно использовать только стандартную сериализацию.
Что будет при сериализации объекта у которого есть поле и оно не Serializable

В таком случае код скомпилируется.

В рантайме при попытке сериализации , когда мы дойдем до этого поля и объекта, мы получим NotSerializableException.

Что такое Externalizable?

это интерфейс, который позволяет вам определять пользовательские правила и собственный механизм для сериализации.
Интерфейс Externalizable расширяет Serializable и добавляет методы записи и чтения
Externalizable не имеет.

Externalizable объект в отличие от Serializable десериализует не в обход конструктора. Должен иметь конструктор без аргументов.


написать администратору сайта