9 i/O Flashcards

1
Q

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

A
Пакет io: класс File
File file = new
В отличие от большинства классов ввода/вывода, класс File работает не с потоками, а непосредственно с файлами. Данный класс позволяет получить информацию о файле: права доступа, время и дата создания, путь к каталогу. А также осуществлять навигацию по иерархиям подкаталогов.
.
Пакет nio: классы
Path и Files
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Чем отличается относительный от абсолютного пути к файлу?

A

Абсолютный путь - это путь, который указывает на одно и то же место в файловой системе,
вне зависимости от каталога из под которого была запущена программа (java-процесс).
Абсолютный путь всегда начинается с корневого каталога.
Например:
/home/maksaimer/file
/etc/passwd
/bin
C:\Users
Относительный путь представляет собой путь по отношению к каталогу из-под которого
запущена программа (java-процесс).
Например:
file
maksaimer/file

Символьная ссылка - файл с записью пути до другого файла или
каталога.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Какие методы знаете у класса File?

A

File file = new File(“/home/maksaimer/file”);

Не требуют доступ к ФС:

file.isAbsolute() - проверяет является ли путь абсолютным или нет
file.getAbsolutePath() - возвращает абсолютный путь для пути, переданного в конструктор объекта;
file.getPath() - возвращает строку, соответствующую пути, переданную в
конструктор
file.getName() - возвращает имя файла
file.getParent() - возвращает имя родительского каталога;

Требуют доступ к ФС:

file.getCanonicalPath()
file.getCanonicalFile()
Эти методы позволяют получить абсолютный и уникальный
путь/файл (объект File, соответствующий такому пути), то есть
разрешаются символьные ссылки и символы “.” и “..”.

file. exists() - существует файл или каталог
file. canRead()/canWrite()/canExecute()
file. length - длинна в байтах файла
file. isFile()/isDirectory()/isHidden
file. createNewFile() - если нет файла - создаёт
file. mkdir()/mkdirs - создаёт каталог/каталоги
file. delete - удаляет файл

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое потоки в Java? Назовите основные классы (без потомков).

A

(Stream). Поток - это абстракция для поставки или потребления информации.

байтовые - java.io.InputStream, java.io.OutputStream;
символьные - java.io.Reader, java.io.Writer.

пакеты java.io, java.nio

Поток ввода-вывода связан с физическим устройством: файл на жёстком диске,
клавиатура, сетевое соединение или массив в оперативной памяти.
Все потоки ввода-вывода ведут себя одинаково, несмотря на отличия в конкретных
физических устройствах с которыми они связаны.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Назовите основные методы потоков и коротко расскажите что они делают?

A

InputStream:

int read() - прочитать из потока один байт (заполняется младший байт int,
остальные байты нули), если в потоке данных больше нет, то вернётся -1.
int read(byte[] b) - прочитать из потока в массив байт,
int read(byte[] b, int off, int len) - прочитать из потока в массив байт, с указанием
начала массива и количества прочитанных байт.
Эти два метода возвращают фактическое количество байт.
void close() - закрыть поток.

OutputStream - наиболее общий поток для чтения байт

void write(int b) - записать один байт в поток (старшие 3 байта будут проигнорированы)
void write(byte[] b) - записать в поток байты из массива
void write(byte[] b, int off, int len) - записать в поток байты из массива, с указанием начала
массива и количества байт
void flush() - если у потока есть буфер, то вызов этого метода опустошает этот буфер и отправляет данные в
место назначения.
void close() - закрывает поток, подразумевает вызов flush()

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Какие реализации потоков вы знаете и чем они отличаются?

A

InputStream:
java.io.FileInputStream - поток для чтения файла = new FileInputStream(new File(“pathToFile”))
java.io.ByteArrayInputStream - Позволяет использовать буфер в памяти (массив байтов) в качестве источника данных для входного потока.
new ByteArrayInputStream(new byte[] {1, 2, 3})
java.io.DataInputStream - поток для чтения значения примитивных типов
new DataInputStream(anotherInputStream)
BufferedInputStream
Буферизированный входной поток
FilterInputStream - Абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства.
ObjectInputStream - Входной поток для объектов
StringBufferInputStream -Превращает строку (String) во входной поток данных InputStream
PipedInputStream Реализует понятие входного канала.
PushbackInputStream - Входной поток, поддерживающий однобайтовый возврат во входной поток
SequenceInputStream - Сливает два или более потока InputStream в единый поток.
———————————————————————————–
OutputStream:
java.io.FileOutputStream - поток для записи в файл = new FileOutputStream(new File(“pathToFile”))
java.io.ByteArrayOutputStream - поток над байтовым массивом для записи
java.io.DataOutputStream - поток для записи значений примитивных типов = new DataOutputStream(anotherOutputStream)
BufferedOutputStream - Буферизированный выходной поток
ObjectOutputStream - Выходной поток для объектов
PipedOutputStream - Реализует понятие выходного канала.
FilterOutputStream - Абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства.
———————————————————————————–
Классы-надстройки наделяют существующий поток дополнительными свойствами. Примеры классов: BufferedOutputStream, BufferedInputStream, BufferedWriter — буферизируют поток и повышают производительность.

InputStream:
класс InputStream представляет классы, которые получают данные из различных источников:

массив байтов
строка (String)
файл
канал (pipe): данные помещаются с одного конца и извлекаются с другого

OutputStream:
Класс OutputStream - это абстрактный класс, определяющий потоковый байтовый вывод.

Поток ввода-вывода связан с физическим устройством: файл на жёстком диске,
клавиатура, сетевое соединение или массив в оперативной памяти.
Все потоки ввода-вывода ведут себя одинаково, несмотря на отличия в конкретных
физических устройствах с которыми они связаны.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Коротко расскажите как бы вы копировали файл?

A
try (FileInputStream inputstream = new FileInputStream("имя файла"))  //создаем первый блог  try добавляем источник ввода
{
    File directory = new File ("src/folder")            //  создаем папку

    if (directory.exists())                                          //выполняем проверку 
 {
       directory.mkdir();                                             // ( если папка не существует, создаем ее при помощи метода mkdir())
  }
     try (FileOutputStream outputstream = new OutputStream("имя файла"))  //создаем второй блок try добавляем источник вывода
   {
           byte[] butes = new byte[1024];                 //создаем массив байт 
           int length;                                                   //создаем переменную типа int length

           while ((length = inputstream.read(butes)) != -1 ) {       //в цикле, пока в потоке не закончатся для записи байты, 
           outputstream.write(buffer, 0, length);                        //будем их передавать в выходной поток и соответственно копировать в новый файл.
           } 

} catch(IOException e) // обрабатываем исключения вывода
{
Sustem.out.println(“Output error”)
}

} catch (IOException e) // обрабатываем исключения ввода
{
Sustem.out.println(“Input error”)
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Что такое потоки символов и назовите основные классы?

A

java.io.Reader - ввод символьных данных, аналогичен InputStream
java.io.Writer - вывод символьных данных, аналогичен OutputStream
Эти потоки работают с символами юникода, а не с байтами. При создании этих потоков обычно
явно указывается кодировка (например: US_ASCII, UTF-8, ISO_8859_1).

В случае ошибок все методы класса передают исключение IOException.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Назовите основные методы потоков символов и коротко расскажите что они делают?

A

java.io.Reader. Основные методы;

Методы аналогичны InputStream.
int read() - прочитать из потока один символ (заполняется младшие два байта int,
остальные байты нули), если в потоке данных больше нет, то вернётся -1.
int read(char[] cbuf) - прочитать из потока в массив символов.
int read(char[] cbuf, int off, int len) - прочитать из потока в массив символов, с
указанием начала массива и количества прочитанных символов.
Эти два метода возвращают фактическое количество байт.
void close() - закрыть поток.
.
java.io.Writer. Основные методы;

Методы аналогичны OutputStream.
void write(int c) - записать символ в поток (старшие два байта будут проигнорированы)
void write(String str) - записать строку в поток
void write(char[] cbuf) - записать массив символов в поток
void write(char[] cbuf, int off, int len) - записать массив символов в поток, начиная с
некоторого индекса,
void flush() - принудительно отправить данные в поток, опустошив буффер.
void close() - подразумевает flush().
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Какие реализации символьных потоков вы знаете и чем они отличаются?

A

Подклассы java.io.Reader
java.io.InputStreamReader = new InputStreamReader(inputStream, “UTF-8”) транслирующий байты в символы;
java.io.CharArrayReader = new CharArrayReader(new char[] {‘a’, ‘b’, ‘c’}) читает из символьного массива;
java.io.BufferedReader = new BufferedReader(new char[] {‘a’, ‘b’, ‘c’}) добавляет буферизацию и полезный метод String readLine(), буферизованный входной символьный поток;
FileReader - входной поток, читающий файл;
FilterReader - абстрактный класс, предоставляющий интерфейс для классов-надстроек;
LineNumberReader - входной поток, подсчитывающий строки;
PipedReader - входной канал;
PushbackReader - входной поток, позволяющий возвращать символы обратно в поток;
StringReader - входной поток, читающий из строки.

Подклассы java.io.Writer
java.io.OutputStreamWriter - в
конструкторе указывается кодировка, если кодировка не указана, тогда
выбирается кодировка ОС. Узнать кодировку можно вызвав метод java.nio.charset.
Charset.defaultCharset().
java.io.CharArrayWriter - выходной поток, который пишет в символьный массив;
java.io.BufferedWriter - поток вывода, добавляющий буферизацию и полезный
метод void newLine(). буферизованный выходной символьный поток;
new BufferedWriter(new char[] {‘a’, ‘b’, ‘c’})
FileWriter - выходной поток, пишущий в файл;
FilterWriter - абстрактный класс, предоставляющий интерфейс для классов-надстроек;
PipedWriter - выходной канал;
PrintWriter - выходной поток символов, включающий методы print() и println(); PrintWriter существует возможность отказаться от автоматического сброса буферов, выполняя его явным образом при помощи метода flush()
StringWriter - выходной поток, пишущий в строку;

Reader и его наследники определяют потоковый ввод символов Unicode;
Writer и его наследники определяют потоковый вывод символов Unicode.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

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

A

Сериализация - процесс трансформации состояния java-объекта в
последовательность байт; десериализация - обратный процесс. Статические поля
не сериализуются.

Мы должны явно разрешить сериализацию: имплементировать интерфейс
Serializable,
в противном случае, при попытке сериализовать объект, будет
выброшено исключение java.io.NotSerializableException.

java.io.Serializable - маркерный интерфейс (не содержит методов).
Если класс содержит поля ссылочных типов, то при сериализации каждый тип
должен быть помеченным Serializable.
Конструктор по умолчанию не обязателен.
Так же все атрибуты и подтипы сериализуемого класса должны быть сериализуемы. Если класс предок был несереализуемым, то этот суперкласс должен содержать доступный (public, protected) конструктор без параметров для инициализации полей.

Чтобы сериализовать объект, нужно передать его в метод writeObject(Object obj) класса
ObjectOutputStream. Куда именно будет отправлен объект определяется оборачиваемым
классом

Для того, чтобы десериализовать объект нужно вызвать метод readObject() класса
ObjectInputStream, откуда именно будет получен объект определяется оборачиваемым классом.
Далее приводится пример десериализации из файла:

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Что означает ключевое слово transient?

A

transient с помощью него
можно указать поля, которые не должны подвергаться сериализации (например,
поля, которые могут быть выведены или кэш).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Расскажите про Externalizable?

A

java.io.Externalizable интерфейс, который подобен java.io.Serializable
Externalizable - определяет свой набор методов, которые имплементор должен реализовать. Этот интерфейс нужно использовать в тех случаях, когда необходимо самостоятельно реализовать процессы сериализации / десериализации

он содержит два метода, которые необходимо реализовать – writeExternal(ObjectOutput) и readExternal(ObjectInput). В этих методах как раз и находится логика сериализации/десериализации.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

В чем разница между IO и NIO?

A

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

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

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

2) Потоки ввода/вывода в Java IO являются блокирующими.
Это значит, что когда в потоке выполнения вызывается read() или write() метод любого класса из пакета java.io.*, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого.

Неблокирующий режим Java NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Тоже самое справедливо и для неблокирующего вывода. Поток выполнения может запросить запись в канал некоторых данных, но не дожидаться при этом пока они не будут полностью записаны.

3)В Java NIO имеются селекторы, которые позволяют одному потоку выполнения мониторить несколько каналов ввода. Т.е. существует возможность зарегистрировать несколько каналов с селектором, а потом использовать один поток выполнения для обслуживания каналов, имеющих доступные для обработки данные, или для выбора каналов, готовых для записи.

Каналы (channels) – абстракции объектов более низкого уровня файловой системы, через которые осуществляется ввод/вывод данных, а буферы являются источниками или приёмниками этих переданных данных.

особенности NIO

1) Каналы и селекторы: NIO поддерживает различные типы каналов. Канал является абстракцией объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки файлов), что позволяет передавать данные с более высокой скоростью. Каналы не блокируются и поэтому Java предоставляет еще такие инструменты, как селектор, который позволяет выбрать готовый канал для передачи данных, и сокет, который является инструментом для блокировки.
2) Буферы: имеет буферизация для всех классов-обёрток примитивов (кроме Boolean). Появился абстрактный класс Buffer, который предоставляет такие операции, как clear, flip, mark и т.д. Его подклассы предоставляют методы для получения и установки данных.
3) Кодировки: появились кодеры и декодеры для отображения байт и символов Unicode.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly