Класс ObjectInputStream
- Все реализованные интерфейсы:
-
Closeable,DataInput,ObjectInput,ObjectStreamConstants,AutoCloseable
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
Предупреждение: Десериализация недоверенных данных представляет собой потенциальную опасность и должна быть избегаема. Недоверенные данные должны быть тщательно валидированы в соответствии с разделом "Сериализация и десериализация" руководства Рекомендаций по защищенному программированию для Java SE. Фильтрация сериализации описывает лучшие практики для защищенного использования фильтров сериализации.
Ключ к предотвращению атак на десериализацию заключается в предотвращении десериализации экземпляров произвольных классов, тем самым предотвращая непосредственное или косвенное выполнение их методов. ObjectInputFilter описывает использование фильтров, а ObjectInputFilter.Config описывает настройку фильтра и фабрики фильтров. Каждый поток имеет необязательный фильтр десериализации для проверки классов и лимитов ресурсов во время десериализации. Фабрика фильтров JVM гарантирует, что фильтр может быть установлен на каждом ObjectInputStream, и каждый объект, считанный из потока, может быть проверен. Конструкторы ObjectInputStream вызывают фабрику фильтров для выбора начального фильтра, который может быть обновлен или заменен с помощью setObjectInputFilter(java.io.ObjectInputFilter).
Если у ObjectInputStream есть фильтр, ObjectInputFilter может проверять, разрешены ли классы, длины массивов, количество ссылок в потоке, глубина и количество байтов, извлеченных из входного потока, и в случае их запрета может завершить десериализацию.
ObjectOutputStream и ObjectInputStream могут предоставить приложению средства для сохранения графов объектов при использовании соответственно с FileOutputStream и FileInputStream. ObjectInputStream используется для восстановления этих ранее сериализованных объектов. Другие применения включают передачу объектов между хостами через сокетный поток или для маршалинга и унмаршалинга аргументов и параметров в системе удалённой связи.
ObjectInputStream гарантирует, что типы всех объектов в графе, созданном из потока, соответствуют классам, присутствующим в виртуальной машине Java. Классы загружаются по мере необходимости с использованием стандартных механизмов.
Из потоков могут считываться только объекты, поддерживающие интерфейсы java.io.Serializable или java.io.Externalizable.
Метод readObject используется для чтения объекта из потока. Для получения нужного типа следует использовать безопасное приведение типов Java. В Java строки и массивы являются объектами и обрабатываются как объекты во время сериализации. При чтении их необходимо привести к ожидаемому типу.
Примитивные типы данных могут быть считанны из потока с помощью соответствующего метода DataInput.
Механизм десериализации объектов по умолчанию восстанавливает содержимое каждого поля до значения и типа, имевшихся во время записи. Поля, объявленные как transient или static, игнорируются процессом десериализации. Ссылки на другие объекты вызывают чтение этих объектов из потока по мере необходимости. Графы объектов восстанавливаются корректно с использованием механизма совместного использования ссылок. При десериализации всегда выделяется новый объект, что предотвращает перезапись существующих объектов.
Чтение объекта аналогично выполнению конструкторов нового объекта. Память выделяется для объекта и инициализируется нулём (NULL). Для несериализуемых классов вызываются конструкторы без аргументов, а затем поля сериализуемых классов восстанавливаются из потока, начиная с сериализуемого класса, ближайшего к java.lang.object, и заканчивая наиболее специфическим классом объекта.
Например, чтобы прочитать из потока, как записано в примере в ObjectOutputStream:
FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
int i = ois.readInt();
String today = (String) ois.readObject();
Date date = (Date) ois.readObject();
ois.close();
Классы управляют своей сериализацией, реализуя интерфейсы java.io.Serializable или java.io.Externalizable.
Реализация интерфейса Serializable позволяет сериализовать объект, сохраняя всё его состояние, и позволяет классам эволюционировать между моментом записи в поток и моментом его чтения. Автоматически просматриваются ссылки между объектами, сохраняя и восстанавливая целые графы.
Сериализуемые классы, требующие специальной обработки во время сериализации и десериализации, должны реализовывать следующие методы:
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException;
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
Метод readObject отвечает за чтение и восстановление состояния объекта для его конкретного класса, используя данные, записанные в поток соответствующим методом writeObject. Методу не нужно беспокоиться о состоянии, принадлежащем его суперклассам или подклассам. Восстановление состояния происходит путём чтения данных из ObjectInputStream для отдельных полей и присваивания их соответствующим полям объекта. Чтение примитивных типов данных поддерживается DataInput.
Любая попытка чтения данных объекта, превышающая границы пользовательских данных, записанных соответствующим методом writeObject, приведёт к выбрасыванию OptionalDataException со значением eof, равным true. Необъектные чтения, превышающие конец выделенных данных, отражают конец данных аналогично тому, как они указывают конец потока: считывание байтов вернёт -1 как считанный байт или количество считанных байтов, а чтение примитивных типов выбросит EOFExceptions. Если нет соответствующего метода writeObject, конец стандартно сериализованных данных отмечает конец выделенных данных.
Вызовы чтения примитивных и объектных данных, выполненные в методе readExternal, ведут себя аналогично – если поток уже находится в конце данных, записанных соответствующим методом writeExternal, чтение объектов выбросит OptionalDataExceptions с eof, установленным в true, чтение байтов вернёт -1, а чтение примитивных типов выбросит EOFExceptions. Обратите внимание, что такое поведение не справедливо для потоков, записанных по старому ObjectStreamConstants.PROTOCOL_VERSION_1 протоколу, в котором конец данных, записанных методами writeExternal, не обозначен и, следовательно, не может быть обнаружен.
Метод readObjectNoData отвечает за инициализацию состояния объекта для его конкретного класса в случае, если поток сериализации не указывает данный класс как суперкласс десериализуемого объекта. Это может произойти в случаях, когда принимающая сторона использует другую версию класса десериализуемого экземпляра, чем отправляющая сторона, и версия получателя расширяет классы, которые не расширяются версией отправителя. Это также может произойти, если поток сериализации был изменён; следовательно, readObjectNoData полезен для корректной инициализации десериализованных объектов, несмотря на "враждебный" или неполный исходный поток.
Сериализация не читает и не присваивает значения полям объектов, не реализующих интерфейс java.io.Serializable. Подклассы объектов, которые не сериализуемы, могут быть сериализуемы. В этом случае несериализуемый класс должен иметь конструктор без аргументов, чтобы разрешить инициализацию его полей. В этом случае подкласс отвечает за сохранение и восстановление состояния несериализуемого класса. Часто поля этого класса доступны (public, package или protected), или существуют методы get и set, которые могут использоваться для восстановления состояния.
Любое исключение, произошедшее во время десериализации объекта, перехватывается ObjectInputStream и прерывает процесс чтения.
Реализация интерфейса Externalizable позволяет объекту полностью контролировать содержимое и формат сериализованной формы объекта. Методы интерфейса Externalizable, writeExternal и readExternal, вызываются для сохранения и восстановления состояния объектов. При реализации классом, они могут записывать и читать собственное состояние с помощью всех методов ObjectOutput и ObjectInput. Объекты несут ответственность за обработку любых изменений версии.
Константы перечислений десериализуются по-другому, чем обычные сериализуемые или внешне сериализуемые объекты. Сериализованная форма константы перечисления состоит только из её имени; значения полей константы не передаются. Для десериализации константы перечисления ObjectInputStream считывает имя константы из потока; десериализованная константа затем получается путём вызова статического метода Enum.valueOf(Class, String) с базовым типом константы перечисления и полученным именем константы в качестве аргументов. Как и другие сериализуемые или внешне сериализуемые объекты, константы перечисления могут служить целями обратных ссылок, появляющихся в потоке сериализации позднее. Процесс десериализации констант перечислений не может быть настроен: любые классово-специфичные методы readObject, readObjectNoData и readResolve, определённые типами перечислений, игнорируются при десериализации. Аналогично, любые объявления полей serialPersistentFields или serialVersionUID также игнорируются – все типы перечислений имеют фиксированную serialVersionUID 0L.
Записи сериализуются по-другому, чем обычные сериализуемые или внешне сериализуемые объекты. Во время десериализации вызывается канонический конструктор записи для создания объекта записи. Некоторые методы, связанные с сериализацией, такие как readObject и writeObject, игнорируются для сериализуемых записей. См. Спецификация Java Object Serialization, Раздел 1.13, "Сериализация записей" для дополнительной информации.
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
ObjectInputStream.GetField |
Предоставляет доступ к постоянным полям, считанным из входного потока. |
Краткое описание полей
Поля, объявленные в интерфейсе java.io.ObjectStreamConstants
baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, SERIAL_FILTER_PERMISSION, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Обеспечивает возможность для подклассов, полностью переопределяющих ObjectInputStream, не выделять частные данные, используемые только данным реализацией ObjectInputStream. |
|
| Создаёт ObjectInputStream, который считывает данные из указанного InputStream. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
int |
available() |
Возвращает количество байтов, которые могут быть считаны без блокировки. |
void |
close() |
Закрывает входной поток. |
void |
defaultReadObject() |
Считывает нестатические и непеременные поля текущего класса из этого потока. |
protected boolean |
enableResolveObject |
Включает возможность для потока заменять объекты, считанные из потока. |
final ObjectInputFilter |
getObjectInputFilter() |
Возвращает фильтр десериализации для этого потока. |
int |
read() |
Считывает байт данных. |
int |
read |
Считывает данные в массив байтов. |
boolean |
readBoolean() |
Считывает логическое значение. |
byte |
readByte() |
Считывает 8-битный байт. |
char |
readChar() |
Считывает 16-битный символ. |
protected ObjectStreamClass |
readClassDescriptor() |
Считывает дескриптор класса из потока сериализации. |
double |
readDouble() |
Считывает 64-битное значение типа double. |
ObjectInputStream.GetField |
readFields() |
Считывает постоянные поля из потока и делает их доступными по имени. |
float |
readFloat() |
Считывает 32-битное значение типа float. |
void |
readFully |
Считывает байты, блокируя до тех пор, пока все байты не будут считаны. |
void |
readFully |
Считывает байты, блокируя до тех пор, пока все байты не будут считаны. |
int |
readInt() |
Считывает 32-битное значение типа int. |
String |
readLine() |
Устаревший. Этот метод не преобразует байты в символы должным образом. |
long |
readLong() |
Считывает 64-битное значение типа long. |
final Object |
readObject() |
Считывает объект из ObjectInputStream. |
protected Object |
readObjectOverride() |
Этот метод вызывается доверенными подклассами ObjectInputStream, которые создали ObjectInputStream с помощью защищенного конструктора без аргументов. |
short |
readShort() |
Считывает 16-битное значение типа short. |
protected void |
readStreamHeader() |
Метод readStreamHeader предоставлен для того, чтобы подклассы могли считывать и проверять собственные заголовки потока. |
Object |
readUnshared() |
Считывает «неразделяемый» объект из ObjectInputStream. |
int |
readUnsignedByte() |
Считывает беззнаковое 8-битное значение типа byte. |
int |
readUnsignedShort() |
Считывает беззнаковое 16-битное значение типа short. |
String |
readUTF() |
Считывает строку в формате изменённого UTF-8. |
void |
registerValidation |
Регистрирует объект, который должен быть проверен перед возвращением графа. |
protected Class<?> |
resolveClass |
Загружает локальный класс, эквивалентный указанному дескриптору класса потока. |
protected Object |
resolveObject |
Этот метод позволит доверенным подклассам ObjectInputStream заменять один объект другим во время десериализации. |
protected Class<?> |
resolveProxyClass |
Возвращает прокси-класс, реализующий интерфейсы, указанные в дескрипторе прокси-класса; подклассы могут реализовать этот метод для считывания пользовательских данных из потока вместе с дескрипторами для динамических прокси-классов, что позволит им использовать альтернативный механизм загрузки для интерфейсов и прокси-класса. |
final void |
setObjectInputFilter |
Устанавливает фильтр десериализации для потока. |
int |
skipBytes |
Пропускает байты. |
Методы, объявленные в классе java.io.InputStream
mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, skipNBytes, transferTo
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Методы, объявленные в интерфейсе java.io.ObjectInput
read, skip
Подробное описание конструкторов
ObjectInputStream
public ObjectInputStream(InputStream in) throws IOException
Конструктор инициализирует фильтр десериализации фильтром, возвращаемым вызовом ObjectInputFilter.Config.getSerialFilterFactory() с null для текущего фильтра и статическим JVM-фильтром по запрошенному фильтру.
Если установлен менеджер безопасности, данный конструктор проверит наличие разрешения SerializablePermission "enableSubclassImplementation" при прямом или непрямом вызове конструктором подкласса, который переопределяет методы ObjectInputStream.readFields или ObjectInputStream.readUnshared.
- Параметры:
-
in- поток ввода для чтения - Исключения:
-
StreamCorruptedException- если заголовок потока неверный -
IOException- если во время чтения заголовка потока произошла ошибка ввода-вывода -
SecurityException- если недоверенный подкласс незаконно переопределяет методы, чувствительные к безопасности -
NullPointerException- еслиinявляетсяnull - См. также:
ObjectInputStream
protected ObjectInputStream() throws IOException, SecurityException
Конструктор инициализирует фильтр десериализации фильтром, возвращаемым вызовом ObjectInputFilter.Config.getSerialFilterFactory() с null для текущего фильтра и статическим JVM-фильтром по запрошенному фильтру.
Если установлен менеджер безопасности, этот метод сначала вызывает метод менеджера безопасности checkPermission с разрешением SerializablePermission("enableSubclassImplementation") для проверки возможности включения подклассов.
- Исключения:
-
SecurityException- если менеджер безопасности существует и его методcheckPermissionзапрещает включение подклассов. -
IOException- если при создании этого потока произошла ошибка ввода-вывода - См. также:
Подробное описание методов
readObject
public final Object readObject() throws IOException, ClassNotFoundException
Корневой объект полностью восстанавливается, когда все его поля и объекты, на которые он ссылается, полностью восстановлены. В этот момент вызываются обработчики проверки объекта в порядке, определяемом их зарегистрированными приоритетами. Обработчики регистрируются объектами (в специальных методах readObject) по мере их индивидуального восстановления.
Фильтр десериализации, если он не null, вызывается для каждого считанного объекта (обычного или класса) для восстановления корневого объекта. Подробности см. в setObjectInputFilter.
Исключения генерируются для проблем с потоком ввода и для классов, которые не должны быть десериализованы. Все исключения являются фатальными для потока ввода и оставляют его в неопределённом состоянии; вызывающая сторона должна игнорировать или восстанавливать состояние потока.
- Определено в:
-
readObjectв интерфейсеObjectInput - Возвращает:
- объект, считанный из потока
- Исключения:
-
ClassNotFoundException- Класс сериализованного объекта не найден. -
InvalidClassException- Что-то не так с классом, используемым для десериализации. -
StreamCorruptedException- Контрольная информация в потоке несогласованна. -
OptionalDataException- В потоке обнаружены примитивные данные вместо объектов. -
IOException- Любые обычные исключения, связанные с вводом-выводом.
readObjectOverride
protected Object readObjectOverride() throws IOException, ClassNotFoundException
- Возвращает:
- объект, считанный из потока.
- Исключения:
-
ClassNotFoundException- Определение класса сериализованного объекта не найдено. -
OptionalDataException- В потоке обнаружены примитивные данные вместо объектов. -
IOException- если при чтении из базового потока произошли ошибки ввода-вывода - См. также:
- С тех пор:
- 1.2
defaultReadObject
public void defaultReadObject() throws IOException, ClassNotFoundException
- Исключения:
-
ClassNotFoundException- если класс сериализованного объекта не найден. -
IOException- если произошла ошибка ввода-вывода. -
NotActiveException- если поток не находится в процессе чтения объектов.
readFields
public ObjectInputStream.GetField readFields() throws IOException, ClassNotFoundException
- Возвращает:
- объект
GetField, представляющий постоянные поля десериализуемого объекта - Исключения:
-
ClassNotFoundException- если класс сериализованного объекта не найден. -
IOException- если произошла ошибка ввода-вывода. -
NotActiveException- если поток не находится в процессе чтения объектов. - С тех пор:
- 1.2
registerValidation
public void registerValidation(ObjectInputValidation obj, int prio) throws NotActiveException, InvalidObjectException
- Параметры:
-
obj- объект, который получит обратный вызов проверки. -
prio- контролирует порядок обратных вызовов; ноль — хорошее значение по умолчанию. Используйте большие числа, чтобы вызов выполнялся раньше, меньшие числа — для более поздних обратных вызовов. В рамках приоритета обратные вызовы обрабатываются без какого-либо определённого порядка. - Исключения:
-
NotActiveException- Поток в данный момент не считывает объекты, поэтому регистрация обратного вызова некорректна. -
InvalidObjectException- Объект проверки равен null.
resolveClass
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException
Соответствующий метод в ObjectOutputStream это annotateClass. Этот метод будет вызван только один раз для каждого уникального класса в потоке. Этот метод может быть реализован подклассами для использования альтернативного механизма загрузки, но должен возвращать объект Class. После возврата, если класс не является массивом, его serialVersionUID сравнивается с serialVersionUID сериализованного класса, и если есть несоответствие, десериализация завершается неудачей, и выбрасывается исключение InvalidClassException.
Встроенная реализация этого метода в ObjectInputStream возвращает результат вызова
Class.forName(desc.getName(), false, loader)
где loader — первый загрузчик классов в стеке текущей нити (начиная с текущего выполняемого метода), который не является загрузчиком платформенных классов и не является его предком; в противном случае, loader — загрузчик платформенных классов. Если этот вызов приводит к ClassNotFoundException, и имя переданного экземпляра ObjectStreamClass является ключевым словом языка Java для примитивного типа или void, то возвращается объект Class, представляющий этот примитивный тип или void (например, объект ObjectStreamClass с именем "int" будет преобразован в Integer.TYPE). В противном случае, вызывающему методу будет брошено исключение ClassNotFoundException. - Параметры:
-
desc- экземпляр классаObjectStreamClass - Возвращает:
- объект
Class, соответствующийdesc - Исключения:
-
IOException- любые обычные исключения ввода/вывода. -
ClassNotFoundException- если класс сериализованного объекта не найден.
resolveProxyClass
protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException
Этот метод вызывается ровно один раз для каждого уникального описателя класса-прокси в потоке.
Соответствующий метод в ObjectOutputStream это annotateProxyClass. Для данного подкласса ObjectInputStream, переопределяющего этот метод, метод annotateProxyClass в соответствующем подклассе ObjectOutputStream должен записывать любые данные или объекты, считанные этим методом.
Встроенная реализация этого метода в ObjectInputStream возвращает результат вызова Proxy.getProxyClass со списком объектов Class для интерфейсов, указанных в параметре interfaces. Объект Class для каждого имени интерфейса i — это значение, возвращаемое в результате вызова
Class.forName(i, false, loader)
где loader — первый загрузчик классов в стеке текущей нити (начиная с текущего выполняемого метода), который не является загрузчиком платформенных классов и не является его предком; в противном случае, loader — загрузчик платформенных классов. Если ни один из резолвированных интерфейсов не является закрытым, то это же значение loader также является загрузчиком классов, передаваемым в Proxy.getProxyClass; если присутствуют закрытые интерфейсы, в качестве загрузчика используется загрузчик классов соответствующего интерфейса (если встречается более одного загрузчика закрытых интерфейсов, выбрасывается IllegalAccessError). Если Proxy.getProxyClass выбрасывает IllegalArgumentException, resolveProxyClass выбросит ClassNotFoundException, содержащую IllegalArgumentException. - Параметры:
-
interfaces- список имён интерфейсов, которые были десериализованы в описателе класса-прокси - Возвращает:
- класс-прокси для указанных интерфейсов
- Исключения:
-
IOException- любое исключение, брошенное базовымInputStream -
ClassNotFoundException- если класс-прокси или любой из указанных интерфейсов не найден - С:
- 1.3
- См. также:
resolveObject
protected Object resolveObject(Object obj) throws IOException
Этот метод вызывается после чтения объекта, но перед его возвратом из readObject. Встроенный метод resolveObject просто возвращает тот же объект.
Если подкласс заменяет объекты, он должен убедиться, что подставленный объект совместим с каждым полем, где будет храниться ссылка. Объекты, тип которых не является подклассом типа поля или элемента массива, прерывают десериализацию, вызывая исключение, и объект не будет сохранён.
Этот метод вызывается только один раз, когда каждый объект встречается впервые. Все последующие ссылки на объект будут перенаправлены на новый объект.
- Параметры:
-
obj- объект, подлежащий замене - Возвращает:
- заменённый объект
- Исключения:
-
IOException- Любые обычные исключения ввода/вывода.
enableResolveObject
protected boolean enableResolveObject(boolean enable) throws SecurityException
resolveObject(java.lang.Object) вызывается для каждого десериализуемого объекта. Если замена объектов в настоящее время не включена, и enable имеет значение true, и установлена система безопасности, этот метод сначала вызывает метод системы безопасности checkPermission с разрешением SerializablePermission("enableSubstitution"), чтобы убедиться, что вызывающий метод имеет разрешение включить возможность замены объектов, считанных из потока.
- Параметры:
-
enable- true для включения использованияresolveObjectдля каждого десериализуемого объекта - Возвращает:
- предыдущее значение до вызова этого метода
- Исключения:
-
SecurityException- если система безопасности существует и её методcheckPermissionзапрещает включение возможности замены объектов, считанных из потока. - См. также:
readStreamHeader
protected void readStreamHeader() throws IOException, StreamCorruptedException
- Исключения:
-
IOException- если при чтении из базовогоInputStreamпроизошли ошибки ввода/вывода -
StreamCorruptedException- если управляющая информация в потоке несогласованна
readClassDescriptor
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException
writeClassDescriptor). По умолчанию этот метод читает описания классов в соответствии с форматом, определённым в спецификации сериализации объектов.- Возвращает:
- прочитанное описание класса
- Исключения:
-
IOException- Если произошла ошибка ввода/вывода. -
ClassNotFoundException- Если класс сериализованного объекта, используемого в представлении описания класса, не найден - С:
- 1.3
- См. также:
read
public int read() throws IOException
- Определено в:
-
readв интерфейсеObjectInput - Определено в:
-
readв классеInputStream - Возвращает:
- прочитанный байт или -1, если достигнут конец потока.
- Исключения:
-
IOException- Если произошла ошибка ввода/вывода.
read
public int read(byte[] buf, int off, int len) throws IOException
- Определено в:
-
readв интерфейсеObjectInput - Переопределяет:
-
readв классеInputStream - Параметры:
-
buf- буфер, в который считываются данные -
off- начальный смещение в целевом массивеbuf -
len- максимальное количество считанных байтов - Возвращает:
- фактическое количество считанных байтов, -1 возвращается при достижении конца потока.
- Исключения:
-
NullPointerException- еслиbufравенnull. -
IndexOutOfBoundsException- еслиoffотрицательно,lenотрицательно илиlenбольше, чемbuf.length - off. -
IOException- Если произошла ошибка ввода/вывода. - См. также:
available
public int available() throws IOException
- Определено в:
-
availableв интерфейсеObjectInput - Переопределяет:
-
availableв классеInputStream - Возвращает:
- количество доступных байтов.
- Выбрасывает:
-
IOException- если при чтении из базовогоInputStreamпроизошли ошибки ввода-вывода
close
public void close() throws IOException
- Определено в:
-
closeв интерфейсеAutoCloseable - Определено в:
-
closeв интерфейсеCloseable - Определено в:
-
closeв интерфейсеObjectInput - Переопределяет:
-
closeв классеInputStream - Выбрасывает:
-
IOException- Если произошла ошибка ввода-вывода.
readBoolean
public boolean readBoolean() throws IOException
- Определено в:
-
readBooleanв интерфейсеDataInput - Возвращает:
- прочитанное булево значение.
- Выбрасывает:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readByte
public byte readByte() throws IOException
- Определено в:
-
readByteв интерфейсеDataInput - Возвращает:
- прочитанный байт размером 8 бит.
- Выбрасывает:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readUnsignedByte
public int readUnsignedByte() throws IOException
- Определено в:
-
readUnsignedByteв интерфейсеDataInput - Возвращает:
- прочитанный байт размером 8 бит.
- Выбрасывает:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readChar
public char readChar() throws IOException
- Определено в:
-
readCharв интерфейсеDataInput - Возвращает:
- прочитанный символ размером 16 бит.
- Выбрасывает:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readShort
public short readShort() throws IOException
- Определено в:
-
readShortв интерфейсеDataInput - Возвращает:
- прочитанное целое число размером 16 бит.
- Выбрасывает:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readUnsignedShort
public int readUnsignedShort() throws IOException
- Определено в:
-
readUnsignedShortв интерфейсеDataInput - Возвращает:
- прочитанное целое число размером 16 бит.
- Выбрасывает:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readInt
public int readInt() throws IOException
- Определено в:
-
readIntв интерфейсеDataInput - Возвращает:
- прочитанное целое число размером 32 бита.
- Выбрасывает:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readLong
public long readLong() throws IOException
- Определено в:
-
readLongв интерфейсеDataInput - Возвращает:
- прочитанное целое число размером 64 бита.
- Выбрасывает:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readFloat
public float readFloat() throws IOException
- Определено в:
-
readFloatв интерфейсеDataInput - Возвращает:
- прочитанное число с плавающей точкой размером 32 бита.
- Выбрасывает:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readDouble
public double readDouble() throws IOException
- Определено в:
-
readDoubleв интерфейсеDataInput - Возвращает:
- прочитанное число с плавающей точкой размером 64 бита.
- Выбрасывает:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readFully
public void readFully(byte[] buf) throws IOException
- Определено в:
-
readFullyв интерфейсеDataInput - Параметры:
-
buf- буфер, в который считываются данные - Выбрасывает:
-
NullPointerException- Еслиbufравноnull. -
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readFully
public void readFully(byte[] buf, int off, int len) throws IOException
- Определено в:
-
readFullyв интерфейсеDataInput - Параметры:
-
buf- буфер, в который считываются данные -
off- начальный смещение в массиве данныхbuf -
len- максимальное количество байтов для чтения - Выбрасывает:
-
NullPointerException- Еслиbufравноnull. -
IndexOutOfBoundsException- Еслиoffотрицательно,lenотрицательно илиlenбольшеbuf.length - off. -
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
skipBytes
public int skipBytes(int len) throws IOException
- Определено в:
-
skipBytesв интерфейсеDataInput - Параметры:
-
len- количество байтов для пропуска - Возвращает:
- фактическое количество пропущенных байтов.
- Выбрасывает:
-
IOException- Если произошла ошибка ввода-вывода.
readLine
@Deprecated public String readLine() throws IOException
- Определено в:
-
readLineв интерфейсеDataInput - Возвращает:
- строку-копию строки.
- Выбрасывает:
-
IOException- если при чтении из базовогоInputStreamпроизошли ошибки ввода-вывода
readUTF
public String readUTF() throws IOException
- Определено в:
-
readUTFв интерфейсеDataInput - Возвращает:
- строку.
- Выбрасывает:
-
IOException- если при чтении из базовогоInputStreamпроизошли ошибки ввода-вывода -
UTFDataFormatException- если прочитанные байты не представляют собой допустимое кодирование строки в формате измененного UTF-8
getObjectInputFilter
public final ObjectInputFilter getObjectInputFilter()
JVM-wide filter factory либо конструктором, либо последним вызовом setObjectInputFilter.- Возвращает:
- фильтр десериализации для потока; может быть null
- С:
- 9
Установить фильтр десериализации
public final void setObjectInputFilter(ObjectInputFilter filter)
filter. Текущий фильтр был установлен в конструкторах ObjectInputStream вызовом глобального фабрики фильтров JVM и может быть null. setObjectInputFilter(ObjectInputFilter) Этот метод} можно вызвать один и только один раз до чтения каких-либо объектов из потока; например, вызвав readObject() или readUnshared(). Замена non-null фильтра на null фильтр запрещена. Если текущий фильтр non-null, значение, возвращаемое фабрикой фильтров, должно быть non-null.
Метод checkInput фильтра вызывается для каждого класса и ссылки в потоке. Фильтр может проверять любой или все из класса, длины массива, количества ссылок, глубины графа и размера входного потока. Глубина - это количество вложенных вызовов readObject, начиная с чтения корня десериализуемого графа и текущего десериализуемого объекта. Количество ссылок - это суммарное количество объектов и ссылок на объекты, уже прочитанных из потока, включая текущий читаемый объект. Фильтр вызывается только при чтении объектов из потока, а не для примитивов.
Если фильтр возвращает Status.REJECTED, null или выбрасывает исключение RuntimeException, активная readObject или readUnshared выбрасывает InvalidClassException, в противном случае десериализация продолжается без прерывания.
- Требования к реализации:
- Фильтр, если не
null, вызывается во времяreadObjectиreadUnsharedдля каждого объекта (обычного или класса) в потоке. Строки обрабатываются как примитивы и не вызывают фильтр. Фильтр вызывается для:- каждой ссылки на объект, ранее десериализованный из потока (класс
null, arrayLength -1), - каждого обычного класса (класс не
null, arrayLength -1), - каждого интерфейса динамического прокси и самого класса динамического прокси (класс не
null, arrayLength -1), - каждого массива фильтруется с использованием типа массива и длины массива (класс - тип массива, arrayLength - запрашиваемая длина),
- каждого объекта, заменённого методом класса
readResolveфильтра, используя класс заменяющего объекта, если неnull, и если это массив, arrayLength, в противном случае -1, - и каждого объекта, заменённого
resolveObject, фильтруется с использованием класса заменяющего объекта, если неnull, и если это массив, arrayLength, в противном случае -1.
checkInputему предоставляется доступ к текущему классу, длине массива, текущему количеству ссылок, уже прочитанных из потока, глубине вложенных вызововreadObjectилиreadUnsharedи зависящему от реализации числу байтов, прочитанных из входного потока.Каждый вызов
readObjectилиreadUnsharedувеличивает глубину на 1 перед чтением объекта и уменьшает на 1 перед нормальным или исключительным возвращением. Глубина начинается с1и увеличивается для каждого вложенного объекта и уменьшается, когда каждый вложенный вызов возвращается. Количество ссылок в потоке начинается с1и увеличивается перед чтением объекта. - каждой ссылки на объект, ранее десериализованный из потока (класс
- Параметры:
-
filter- фильтр, может быть null - Исключения:
-
SecurityException- если есть менеджер безопасности иSerializablePermission("serialFilter")не предоставлен -
IllegalStateException- если объект был прочитан, если фабрика фильтров возвращаетnullкогда текущий фильтр не равен null, или если фильтр уже был установлен. - С:
- 9
© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/ObjectInputStream.html