Файл: Разница в io при работе с файлом и директорией. Что делает метод available().docx

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

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

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

Добавлен: 04.12.2023

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

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

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

  1. Разница в IO при работе с файлом и директорией.

  2. Что делает метод available()?

  3. Что возвращает метод read()? Почему? Что вернет, если считает -1? Что возвращает перегруженый метод с массивом?

  4. Граница значения байта вообще и которые используются в IO?

  5. Что такое декоратор? Пример в IO

  6. Что такое паттерн адаптер?

  7. Что если я не хочу сериализовывать поле? Что если при десериализации поменять тип?

  8. Разница глубокого и поверхностного копирования. Как сделать глубокое при помощи метода clone() и без неё?

  9. Какие копии создаются методом clone() в Java по умолчанию?

  10. В каких случаях использовать reader и scanner?

  11. Конструкторы и методы класса File.

  12. Методы создания файлов.

  13. Абсолютный и относительный путь.

  14. Что такое Externalizable и для чего он нужен?

  15. Что будет если перед десериализцией изменится класс, почему будет выброшено исключение?

  16. BuferedReader и BuferedWriter, их методы и отличия от стримов.

  17. Почему важно закрывать потоки?

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

  19. Особенность сериализации поля final?

  20. Какие интерфейсы реализует InputStream/ OutputStream/ Reader/ Writer?

  21. Thread и Runnable, что выбрать? Зачем нужно два вида реализации многопоточности?

  22. Какие потоки можно не закрывать (не вызывать метод close())?

  23. Что возвращает перегруженный read? Какаое максимальное значение вернет?

  24. Можно ли клонировать String

  25. Можно ли клонировать массив String

  26. Что будет при сериализации объекта у которого есть поле и оно не Serializable?

  27. Гарантируется ли запись данных в файл при вызове flush ?

  28. Что такое токен в Scanner?

  29. Три способа клонировать объект? Что в Java можно клонировать?

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

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

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

  33. Как удалить директорию с файлами? Что если в ней есть вложенные директории?

  34. Что делает метод read? Почему он возвращает int а не byte? Почему он не может возвращать byte?

  35. Что вернет метод read(), если он считывает файл и ему встречается байт равный -1?

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

  37. Есть ли у сканера буфер?

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

  39. Можно ли flush() для небуферизированного потока и что будет?

  40. Пример адаптера и декоратора из IO

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

  42. Что делает flush? Выполнится ли flush если мы сделаем close у потока?

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

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

  45. Сериализация потомков сериализованных родителей.

  46. Особенность сериализации поля final ?

  47. Externalizable vs Serializable

  48. Как работает сам close()? Что и зачем нужно закрывать?

  49. Для чего класс File? Что и как можно создать? как можно удалять

  50. На каких паттернах основана иерархия потоков ввода/вывода. Знать и понимать реализацию




  1. Итак, базовая сущность файловой системы - это файл. Для работы с этой сущностью существует класс java.io.File. Этот класс представляет собой как простые файлы, так и директории (папки).

Допустим, у нас есть папка "C:/temp" и мы хотим работать с файлом 1.bin в этой папке. Чтобы это сделать - нужно сначала создать объект класса File. Отмечу, что создание объекта класса File не создает файл

непосредственно в файловой системе, речь идет лишь об объекте в памяти.

  1. .available() не блокирует поток выполнения при отсутствии данных , а .read() - блокирует.

.available() возвращает примерное количество доступных для чтения байтов, а .read(byte[] b) - количество считанных в буфер (массив байтов), от -1 при достижении конца потока данных и до размера массива (b.length).

.available() лишь проверяет наличие данных, а .read() - их считывает.

  1. Функция InputStream.read() возвращает считанный байт в интервале от 0 до 255 или -1 если считать его не представляется возможным.

Итого 257 вариантов и тип byte их уже не охватывает.

Если считает -1, то вернет 255, так как значение обрезается до 8 битов

(Перегруженный)Возвращает количество байтов прочитанных в буффер, или -1 если в [] нет данных.

  1. Может принимать одно из 256 (от 0 до 255, но в джаве используется знаковый байт поэтому значения – -2^7 – 2^7-1).

Байт в IO 0..255

  1. Декоратор — это структурный паттерн, который позволяет добавлять объектам новые поведения на лету, помещая их в объекты-обёртки.

inputstream, bytearrayinputstream, stringbuilderinputstreams и так далее являются основанными элементами. Filterinputstream - это базовый класс для классов декораторов. Фильтр входных потоков (например, bufferedinput stream) может выполнять дополнительные функции при чтении потоков или записи в них.

  1. Адаптер (Adapter) – это структурный паттерн, который позволяет адаптировать интерфейс класса в соответствии с требованиями системы. То есть, адаптер — это своеобразная прослойка между классами, приводящая интерфейс одного класса к используемому в другом.

OutputStreamWriter мы легко «адаптирует» два интерфейса классов Writer и OutputStream друг другу.



Класс InputStreamReader — это классический адаптер, он адаптирует InputStream и Reader

  1. Если добавить к полю ключевое слово transient – такое поле не сериализуется

В таком случае будет выкинут InvalidClassException

  1. Поверхностное копирование копирует настолько малую часть информации, насколько это возможно. По умолчанию, клонирование в Java является поверхностным, т.е. Object class не знает о структуре класса, которого он копирует. При клонировании, JVM делает такие вещи:

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

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

Глубокое клонирование требует выполнения следующих правил:

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

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

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

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








  1. Object.clone() по умолчанию выполняет поверхностную копию.

  2. Экземпляры класса java.io.BufferedReader предназначены для чтения потока символов с буферизацией (символов, массивов и строк).


Экземпляры класса java.util.Scanner предназначены для разбора данных на составляющие с учетом форматов, шаблонов, разных разделителей. Входные данные для Scanner могут быть файлы, потоки байтов, потоки символов, строки.











  1. Использовать метод File.createNewFile(). Этот метод возвращает логическое значение
    Если вы хотите создать новый файл и в то же время, если хотите записать в него некоторые данные, вы можете использовать метод записи FileOutputStream. В Java FileOutputStream является классом потока байтов. Чтобы записать данные в файл, вы должны преобразовать данные в байты, а затем сохранить их в файл.

Files.write() – лучший способ создать файл, и он должен быть вашим предпочтительным подходом в будущем, если вы его еще не используете. Это хороший вариант, потому что нам не нужно беспокоиться о закрытии ресурсов ввода-вывода.

Создание временного файла в java может потребоваться во многих сценариях, но в основном это происходит во время модульных тестов, где вы не хотите сохранять результаты. Создание с помощью java.io.File.createTempFile()




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

  2. Интерфейс Externalizable - это интерфейс, который позволяет вам определять пользовательские правила и собственный механизм для сериализации. Сериализация по умолчанию не защищает конфиденциальную информацию, такую как пароли и учетные данные, или что, если разработчики хотят обеспечить некоторую информацию во время процесса сериализации?

  3. Если мы изменим структуру нашего класса, например поля удаления / добавления, этот номер версии serialVersionUID также изменится, и в соответствии с JVM наш класс не будет совместим с версией класса сериализованного объекта. Вот почему мы получаем исключение InvalidClassException. JVM просто напросто не понимает как десериализовать сериализованный класс!

  4. BufferedReader/BufferedWriter - наследник Reader/Writer добавляющий методы чтения и записи целых строк, а не отдельных символов. буферизуя прочитанные символы, чтобы обеспечить эффективное считывание символов, массивов и строк. Можно указать в конструкторе вторым параметром размер буфера.


InputStream/OutputStream - потоки читающие, пишущие байты. Читать и писать они могут все, т.к. все записано в байтах.

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

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

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

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

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

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

Files(относится к NIO)

Files — это утилитный класс, куда были вынесены статические методы из класса File. Files — это примерно то же, что и Arrays или Collections, только работает он с файлами, а не с массивами и коллекциями :)

Он сосредоточен на управлении файлами и директориями. Используя статические методы Files, мы можем создавать, удалять и перемещать файлы и директории.

В Java есть специальный класс (File), с помощью которого можно управлять файлами на диске компьютера – он устаревший, и весто него рекомендуется использовать Path

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