Файл: Что такое потоки вводавывода Как это реализовано в 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?
Создание экземпляра класса с теми же значениями полей и теми же методами