IO Flashcards

1
Q

Методы FIle

A

1)boolean mkDir() создает конечную папку если остальной путь существует, boolean mkdirs() создает при отсутсвии все папки пути.
2)boolean exists() проверяет есть ли файл на диске.
3)long length() - длина файла в байтах
4)isDirectory(),isFile() проверяет папка или файл
5)boolean renameTo(File) - переименовывает файл.
6)boolean delete - удаляет файл или пустую папку. Возвращает false если нету такого файла
7) File[] listFiles() возвращает список файлов и папок в текущей папке
У лист и listFiles есть перегруженные версии с FileNameFilter(класс имеющий один метод accept- проверяющий соответствие определенному строковому критерию).
8) Path toPath() переводит в nio путь.
9) String getName, getParent, getCanonialPath и getAbsolutePath возвращают соответственно имя файла,путь родительской директории (путь к файлу без его имени), каноническое (сокращенное) и полное имя в виде строки.

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

Разница между Reader/Writer и InputOutpuStream

A

Input/OutputStream работают с байтами, Reader/Writer с char и String (хотя внутри все равно идет работа с байтами). Reader/Writer существуют только для удобства- все что можно сделать с их помощью можно сделать и с помощью Input/OutputStream.

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

try-with-resources

A

1) Автоматом закрывает стрим реализующий auto-closeable- это родительский интерфйс интерфейса closeable
2) Если ресурсов в блоке несколько- то они закрываютс в обратном порядке. Разделять их нужно точкой с запятой- последняя не обязательна.
3) Фактическое закрытие происходит до выполнения catch/finally

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

mark/skip логика для IO

A

У Reader и InputStream есть методы
boolean markSupported() проверяет можно ли ставить марки,
mark(int) позволяет поставить марку и установить предел символов впереди после которых еще можно вернуться к данной марке методом reset().
Reset() только возвращает указатель стрима к марке, а уже считанную информацию не удаляет.
skip(long) пропускает при чтении указанное количество байт.

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

Методы InputStream

A

close()
int read() возвращает считанный байт в виде int и -1 если больше нет байтов для чтения
boolean markSupported()
mark(int)
reset()
skip(long)
int read(byte[])-читает в переданный массив байтов, возвращает количество считанных байтов- есть перегруженный метод с оффсетом и лимитом.
Количество прочитанных байтов важно т. к. в конце может быть значение меньше размера буффера и больше 0, это число нужно будет передать для записи, т. к. иначе будут записаны значения с прошлой записи буфера. Размер буфера обычно выбирается степень 2.

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

Методы Reader

A
close() 
int read() возвращает считанный байт в виде int и -1 если больше нет байтов для чтения
boolean markSupported() 
mark(int)
reset()
skip(long) 
int read (char[] buf)-читает много символов в буфер, возвращает количество прочитанных символов. Есть перегруженная версия с оффсетом и лимитом.
int read(Charbuffer) читает символы в объект чарбуффер
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Методы OutputStream

A

close() - под капотом вызывает также флаш
write(int) - записывает в файл 1 байт, обрезая целочисленное значение параметра до байта
flush() - когда информация записывается куда-то, то она временно хранится в памяти и если в это время произойдет сбой, то она будет утрачена. Для записи такой информации необходимо вызвать flush()- он требует записать блок незаписанной информации на диск (т.к. при методе write jvm вначале собирает блок информации перед записью на диск).. Его нельзя использовать слишком часто- т. к. может снизить производительность.
OutputStream
write(byte[]) - записывает массив байтов- есть перегруженная версия с офсетом и лимитом (в цикле с буфером ограниченного размера обязательно использовать перегруженную версию и записывать конкретно столько байт сколько вычитано из inputstream).

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

Методы Writer

A

close()
write(int)
flush()
write(String)- записывает строку, преобразуя ее в массив символов- также имеет перегруженную версию с оффсетом.
write(char[] buf)- имеет перегруженную версию с офсетом и лимитом.
newLine() записывает перенос строки.
Writer append(Charsequence или char)- добавляет параметры к райтеру.

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

Buffered стримы

A

BufferedInputStream и BufferedOutPutStream
-функциональные обертки наследующие от FilterInput OutputStream- позволяющие буферизовать данные. Буферизация- обозначает перфоманс импрувы для read/write методов с буфферами- массивами.
BufferedReader-адаптер, реализующий метод readLine(), который читает символы до символа enter. Предпочтительно использовать для строк- для остальных значений примитивов DataInputStream хорошо подходит.
BufferedWriter - адаптер для writer буферизующий данные.

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

File стримы

A

FileInputStream/FileOutputStream
- позволяет читать из файла/записывать в файл байты.
FileReader,FileWriter- являются адаптерами между File и Reader,Writer, аналоги FileInputStream и FileOutputStream. Они даже наследуют от адаптеров InputStreamReader и OutputStreamWriter

Все файловые стримы имеют конструкторы на базе путей файлов и самих объектов FIle- при использовании несуществующего файла конструкторы инпут стримов кидают FileNotFoundException. КОнструкторы output стримов могут принимать дополнительный append флаг, который означает что делать при уже существующем destination файле- заменять его или писать в его конец (по дефолту false- Замещать)

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

Сериализация

A

Serializable -Интерфейс маркер которым программист показывает, что класс помеченный данным интерфейсом поддерживает сериализацию, и все его переменные тоже. Если какое то поле не поддерживает, то его можно исключить из сериализации ключевым словом transient. Также не сериализуются статические переменные.
Если попытаться сериализовать несериализуемый объект то выкинется исключение NotSerialazableException.
Несериализуемый объект- объект не имплементящий маркер интерфейс, или имеющий поля которые являются несериализуемыми объектами и не помечены transient(исключение только если они Null на момент сериализации)
Serializable неявно задает поле serialVersionUID для сериализуемого объекта, которое меняется при внемении изменений в состав полей объекта. Данный UID сравнивается каждый раз при десериализации объекта, если UID десериализуемого объекта и текущей версии класса данного объекта не совпадает то будет InvalidClassException. Можно явно задавать serialVersionUID и его значение, и регулировать при каких изменениях класса мы меняем UID а при каких нет (если не меняем то при десериализации все равно будет добавлено новое поле но с дефолтным значением). Рекомендуется явно определять это поле всегда, т. к. можно регулировать изменение UID а также, т.к. неявно задаваемое UID может меняться и при различных версиях JVM что может вызвать ошибки десериализации на ровном месте.

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

Процесс десериализации объекта

A

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

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

Маски format у PrintStream

A

%s Applies to any type, commonly String values
%d Applies to integer values like int and long
%f Applies to floating‐point values like float and double
%n Inserts a line break using the system‐dependent line separator
Флаги:
%.xf - точность дробного числа
%5f- указывает до скольки символов ограничивать.дополнять вывод. Если после % указать 0 дополнять будет нулем (%05f)

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

PrintStream/PrintWriter

A
  • high level стримы (внутрь можно заворачивать OutputStream и writer), реализующие вывод в печать(консоль) данных.
    System.out это статическое поле типа PrintStream. PrintWriter - аналог PrintStream. Принимает на вход любой reader- преформатирует смимвольный поток переданный для человеческого восприятия.
    И те и другие имеют конструкторы аналогичные File стримам- принимающий путь файла или файл чтобы сразу создать обертку на файл стримом. Также есть удобный конструктор PrintStream(OutputStream).
    Методы:
    1)print(),println(),printf(),format(String,args….)- данные методы не бросают IOException что иногда неудобно. При не стринговом аргументе вызывают метод String.valueOf(arg). Println в конце добавляет FilelineSeparator (System.getProperty(“line.separator”) или System.lineSeparator()
  • для Unix \n для винды \r\n). Printf и format полностью идентичны.
    2) format() имеет перегруженную версию с Locale
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Console

A

Console (с Java 6)- синглтонный класс, вызываемый через System.console(). Может вернуть null для окружений не поддерживающих текстовую консоль.
Методы:
1)writer() возвращает PrintWriter
2reader() возвращает Reader
3)String readLine() и перегруженная readLine(String format,Object…args) выдающая форматированный текст перед выдачей.
4)format,printf -шортхэнд методы, аналогичные методам writer
5)flush() из буфера записывает все данные
6)char[] readPassword() то же что и readLine но без echo введенного текста. Также аналогично readLine есть перегруженная версия char[] readPassword(String format, Object …args) .Массив чар более безопасен, т. к. строка хранится в пуле строк, и можно анализируя пул строк изъять оттуда пароль.

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

Системные IO

A

System.out,System.err -принтстримы
System.in -Inputstream
Они все статические, и их закрытие приведет к закрытию вывода для всего приложения.