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

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

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

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

Добавлен: 23.11.2023

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

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

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


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

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

Ввод-вывод в программах на Java осуществляется посредством потоков. Поток — это некая абстракция производства или потребления информации. С физическим устройством поток связывает система ввода-вывода. Все потоки действуют одинаково — даже если они связаны с разными физическими устройствами. Поэтому классы и методы ввода-вывода могут применяться к самым разным типам устройств. Например, методами вывода на консоль можно пользоваться и для вывода в файл на диске. Для реализации потоков используется иерархия классов, содержащихся в пакете java.io.

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

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




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

Метод read() используется для чтения символов.
Данный метод возвращает кол-во только что прочитанных символов (целое число от 0 до 65635) или -1, если достиг конца stream(потока).
Он возвращает int, потому что диапазон byte в Java лежит от -127 до 127, а возвращаемое значение метода read() лежит в диапазоне от 0 до 255.
Чтобы получит представление byte в int, в методе read() используется побитовое "И" с числом 255, т.е убираются лидирующие единицы


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

Как вам должно быть уже известно, во все программы на Java автоматически импортируется пакет java. lang. В этом пакете определен класс System, инкапсулирующий некоторые элементы среды выполнения программ. Помимо прочего, в нем содержатся предопределенные переменные in, out и err, представляющие стандартные потоки ввода-вывода. Эти поля объявлены как public, final и static. А это означает, что ими можно пользоваться в любой другой части программы, не ссылаясь на конкретный объект типа System.


Переменная System.out ссылается на поток стандартного вывода. По умолчанию этот поток связан с консолью. А переменная System, in ссылается на поток стандартного ввода (по умолчанию с клавиатуры). И наконец, переменная System.err ссылается на поток стандартных сообщений об ошибках, которые по умолчанию выводятся на консоль. По мере необходимости все эти потоки могут быть перенаправлены на другие совместимые устройства ввода-вывода.

Поток System.in представляет собой объект типа InputStream, а потоки System.out и System.err — объекты типа PrintStream. Хотя эти потоки обычно используются для чтения и записи символов, они на самом деле являются байтовыми потоками. Дело в том, что эти потоки были определены в первоначальной спецификации Java, где символьные потоки вообще не были предусмотрены. Как станет ясно в дальнейшем, для этих потоков можно по необходимости создать оболочки, превратив их в символьные потоки.


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

Метод flush() используется, чтобы принудительно записать в целевой поток данные, которые могут кэшироваться в текущем потоке. Актуально при использовании буферизации и/или нескольких объектах потоков, организованных в цепочку.

Вы пишете некую программу и не закрываете ресурсы, понадеявшись на ОС. Но затем Ваш код из самостоятельной единицы превращается в часть кода другой, более мощной программы. Но Ваш код не освобождает ресурсы и в результате эти ресурсы "висят" невостребованными. Более того, Ваш код выполняется много раз и каждый раз открывает ресурс и не закрывает его. Такое поведение по меньшей мере приводит к напрасному расходу этих ресурсов, а в более глобальной перспективе замедляет работу не только программы, но и компьютера, на котором она выполняется.


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

Важно понять, что Reader и Writer – это абстрактные классы. Они ничего не делают и практически не содержат кода. Все их методы должны будут реализовываться в классах, которые будут унаследованы от них. Их же задача – стандартизировать механизм взаимодействия между классами. Разработчикам не нужно изобретать свои стандарты для взаимодействия друг с другом. Гораздо удобнее всем поддерживать несколько базовых стандартов. Тогда классы, написанные разными программистами, смогут легко взаимодействовать не только с классами, написанными разработчиками Java, но и с классами других программистов.






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

ByteArrayInputStream позволяет выполнять "потоковую передачу" из массива байтов. Если вы обернете это в InputStreamReader, вы сможете читать символы. InputStreamReader Позволяет указать кодировку символов.


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

Отличие Scanner'a от BufferedReader'a. BufferedReader работает синхронно, а Scanner — нет. BufferedReader следует использовать, если мы работаем с несколькими потоками. BufferedReader имеет значительно большую буферную память, чем Scanner. Сканер имеет небольшой буфер (1KB буфер символов) в отличие от BufferedReader (8KB байтовый буфер), но этого более чем достаточно.

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


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

В Java есть специальный класс (File), с помощью которого можно управлять файлами на диске компьютера. Для того чтобы управлять содержимым файлов, есть другие классы: FileInputStream, FileOutputStream. Файлы можно создавать, удалять, переименовывать и еще много чего. Практически во все классы, которые работают (читают, пишут, изменяют) с содержимым файла, можно передавать объект класса File.




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

File — это класс, Path — это интерфейс. Методы работы с ФС через объект Path при ошибках ввода-вывода бросают исключения; методы работы с File при ошибках возвращают false. File — это старый способ доступа к файловой системе, Path — это новый рекомендуемый способ. Path допускает работу с файлами на виртуальных файловых системах, а File нет.


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

Вам следует запомнить, что главное отличие абсолютного пути от относительного — наличие символа / в начале пути. Без начального прямого слэша относительный путь указывается относительно текущего местонахождения, а с прямым слэшем вначале относительный путь указывается относительно корневого каталога файловой системы и чаще называется абсолютным путем.



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

Клонирование – это процесс создания копии объекта. Класс объектов Java поставляется с собственным clone () методом, который возвращает копию существующего экземпляра. Поскольку Object является базовым классом в Java, все объекты по умолчанию поддерживают клонирование. Клонирование объектов Java.найдено на javascopes.com

Для клонирования объекта в Java можно воспользоваться тремя способами:

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

Использование конструктора копирования

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


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

FileUtils.deleteDirectory


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

Точной копией оригинала является его клон. В Java это означает возможность создавать объект с аналогичной структурой, как и у исходного объекта. Метод clone() обеспечивает эту функциональность. Поверхностное копирование копирует настолько малую часть информации, насколько это возможно. По умолчанию, клонирование в Java является поверхностным, т.е. Object class не знает о структуре класса, которого он копирует. При клонировании, JVM делает такие вещи:

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

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

Глубокое копирование дублирует все. Глубокое копирование — это две коллекции, в одну из которых дублируются все элементы оригинальной коллекции. Мы хотим сделать копию, при которой внесение изменений в любой элемент копии не затронет оригинальную коллекцию. Глубокое клонирование требует выполнения следующих правил:

  1. Нет необходимости копировать отдельно примитивные данные;

  2. Все классы-члены в оригинальном классе должны поддерживать клонирование. Для каждого члена класса должен вызываться super.clone() при переопределении метода clone();

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





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

Сериализация имеющихся объектов – это процесс сохранения состояния объекта в последовательность байт. Механизм, который позволят «записывать» полученный прогресс для будущей выгрузки.

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

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

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

1. JSON. JavaScript Object Notation

2. XML

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

4. YAML - Yet Another Markup Language. Как сериализовать объект класса. Нужно пометить его маркерным классом Serializable. Что делать, если одно из полей сериализовывать не нужно. Это поле нужно пометить ключевым словом transient. Как сериализовать статическое поле.


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

Поля класса, помеченные модификатором transient, не сериализуются.

Обычно в таких полях хранится промежуточное состояние объекта, которое, к примеру, проще вычислить. Другой пример такого поля - ссылка на экземпляр объекта, который не требует сериализации или не может быть сериализован.

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


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



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