Класс ObjectInputStream
- Все реализуемые интерфейсы:
Closeable, DataInput, ObjectInput, ObjectStreamConstants, AutoCloseable
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
Предупреждение: десериализация недоверенных данных по своей сути опасна, и её следует избегать. Недоверенные данные необходимо тщательно проверять в соответствии с разделом «Сериализация и десериализация» документа Рекомендации по безопасному программированию для Java SE. В документе Фильтрация сериализации описаны рекомендации по безопасному использованию фильтров сериализации.
Ключ к предотвращению атак с использованием десериализации — не допускать десериализации экземпляров произвольных классов, тем самым предотвращая прямое или косвенное выполнение их методов. В интерфейсе ObjectInputFilter описано использование фильтров, а в классе ObjectInputFilter.Config — настройка фильтра и фабрики фильтров. Для каждого потока можно задать необязательный фильтр десериализации, проверяющий классы и ограничения ресурсов во время десериализации. Фабрика фильтров для всей JVM гарантирует, что фильтр можно задать для каждого ObjectInputStream и что можно проверить каждый объект, считанный из потока. Конструкторы ObjectInputStream вызывают фабрику фильтров для выбора начального фильтра, который впоследствии можно обновить или заменить с помощью setObjectInputFilter(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:
try (FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis)) {
String label = (String) ois.readObject();
LocalDateTime dateTime = (LocalDateTime) ois.readObject();
// Use label and dateTime
} catch (Exception ex) {
// handle exception
}
Классы управляют способом своей сериализации, реализуя интерфейс 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 со значением true в поле eof. Попытки чтения данных, не являющихся объектами, за пределами выделенных данных будут обозначать конец данных так же, как и конец потока: при побайтовом чтении будет возвращено значение -1 в качестве считанного байта или количества считанных байтов, а при чтении примитивных значений будут выброшены EOFExceptions. Если соответствующий метод writeObject отсутствует, конец сериализованных данных по умолчанию обозначает конец выделенных данных.
Вызовы методов чтения примитивных значений и объектов изнутри метода readExternal ведут себя одинаково: если поток уже находится в конце данных, записанных соответствующим методом writeExternal, при чтении объектов будут выброшены OptionalDataExceptions со значением true в поле eof, при побайтовом чтении будет возвращено значение -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, раздел 1.13 «Сериализация записей».
- Начиная с версии:
- 1.1
- Внешние спецификации
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
ObjectInputStream.GetField |
Предоставляет доступ к сохраняемым полям, считанным из входного потока. |
Краткое описание полей
Поля, объявленные в интерфейсе 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() |
Считывает значение типа boolean. |
byte |
readByte() |
Считывает 8-битный байт. |
char |
readChar() |
Считывает 16-битный символ char. |
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-битный байт. |
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 |
Пропускает байты. |
Методы, объявленные в классе InputStream
mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, skipNBytes, transferTo
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Методы, объявленные в интерфейсе ObjectInput
read, skip
Подробное описание конструкторов
ObjectInputStream
public ObjectInputStream(InputStream in) throws IOException
Конструктор инициализирует фильтр десериализации фильтром, возвращённым при вызове фабрики фильтров сериализации, полученной из ObjectInputFilter.Config.getSerialFilterFactory(), с null для текущего фильтра и фильтром, действующим на всю JVM для запрошенного фильтра. Если свойства фильтра сериализации или фабрики фильтров сериализации недопустимы, выбрасывается IllegalStateException. При вызове метода фабрики фильтров apply может выбросить исключение времени выполнения, препятствующее созданию ObjectInputStream.
- Параметры:
-
in— входной поток для чтения - Выбрасывает:
-
StreamCorruptedException— если заголовок потока некорректен -
IOException— если при чтении заголовка потока произошла ошибка ввода-вывода -
IllegalStateException— если инициализацияObjectInputFilter.Configзавершается с ошибкой из-за недопустимых свойств фильтра сериализации или фабрики фильтров сериализации. -
NullPointerException— еслиinимеет значениеnull - См. также:
ObjectInputStream
protected ObjectInputStream() throws IOException
Конструктор инициализирует фильтр десериализации фильтром, возвращённым при вызове фабрики фильтров сериализации, полученной из ObjectInputFilter.Config.getSerialFilterFactory(), с null для текущего фильтра и фильтром, действующим на всю JVM для запрошенного фильтра. Если свойства фильтра сериализации или фабрики фильтров сериализации недопустимы, выбрасывается IllegalStateException. При вызове метода фабрики фильтров apply может выбросить исключение времени выполнения, препятствующее созданию ObjectInputStream.
- Выбрасывает:
-
IOException— если при создании этого потока произошла ошибка ввода-вывода -
IllegalStateException— если инициализацияObjectInputFilter.Configзавершается с ошибкой из-за недопустимых свойств фильтра сериализации или фабрики фильтров сериализации.
Подробное описание методов
readObject
public final Object readObject() throws IOException, ClassNotFoundException
Корневой объект полностью восстанавливается, когда восстановлены все его поля и объекты, на которые он ссылается. На этом этапе выполняются обратные вызовы проверки объекта в порядке, определяемом зарегистрированными приоритетами. Объекты регистрируют обратные вызовы по мере своего восстановления (в специальных методах readObject).
Фильтр десериализации, если он не null, вызывается для каждого объекта (обычного или класса), считываемого для восстановления корневого объекта. Подробности см. в разделе setObjectInputFilter.
При проблемах с InputStream и для классов, которые не следует десериализовать, выбрасываются исключения. Все исключения являются фатальными для InputStream и оставляют его в неопределённом состоянии; вызывающая сторона должна сама решить, игнорировать ли состояние потока или попытаться его восстановить.
- Определён в:
-
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)
resolveObject(Object) вызывается для каждого десериализуемого объекта.- Параметры:
-
enable— true, чтобы включить использованиеresolveObjectдля каждого десериализуемого объекта - Возвращает:
- предыдущее значение параметра до вызова этого метода
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 - Возвращает:
- считанное значение boolean.
- Выбрасывает:
-
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-битное значение char.
- Выбрасывает:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readShort
public short readShort() throws IOException
- Определён в:
-
readShortв интерфейсеDataInput - Возвращает:
- считанное 16-битное значение short.
- Выбрасывает:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readUnsignedShort
public int readUnsignedShort() throws IOException
- Определён в:
-
readUnsignedShortв интерфейсеDataInput - Возвращает:
- считанное 16-битное значение short.
- Выбрасывает:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readInt
public int readInt() throws IOException
- Определён в:
-
readIntв интерфейсеDataInput - Возвращает:
- считанное 32-битное целое число.
- Выбрасывает:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readLong
public long readLong() throws IOException
- Определён в:
-
readLongв интерфейсеDataInput - Возвращает:
- считанное 64-битное значение long.
- Выбрасывает:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readFloat
public float readFloat() throws IOException
- Определён в:
-
readFloatв интерфейсеDataInput - Возвращает:
- считанное 32-битное значение float.
- Выбрасывает:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readDouble
public double readDouble() throws IOException
- Определён в:
-
readDoubleв интерфейсеDataInput - Возвращает:
- считанное 64-битное значение double.
- Выбрасывает:
-
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 - Возвращает:
- копию строки в виде String.
- Вызывает исключение:
-
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
setObjectInputFilter
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для каждого объекта (обычного объекта или класса) в потоке. Строки рассматриваются как примитивы, поэтому фильтр для них не вызывается. Фильтр вызывается для:- каждой ссылки на объект, ранее десериализованный из потока (class имеет значение
null, arrayLength равна -1), - каждого обычного класса (class не имеет значения
null, arrayLength равна -1), - каждого класса-интерфейса, на который явно ссылается поток (для интерфейсов, реализуемых классами в потоке, фильтр не вызывается),
- каждого интерфейса динамического прокси и самого класса динамического прокси (class не имеет значения
null, arrayLength равна -1), - каждого массива с использованием типа массива и его длины (class — это тип массива, arrayLength — запрошенная длина),
- каждого объекта, заменённого методом
readResolveего класса: фильтрация выполняется с использованием класса объекта-замены, если он неnull, а если это массив — с использованием arrayLength; в противном случае используется -1, - а также каждого объекта, заменённого методом
resolveObject: фильтрация выполняется с использованием класса объекта-замены, если он неnull, а если это массив — с использованием arrayLength; в противном случае используется -1.
checkInputему предоставляется доступ к текущему классу, длине массива, текущему количеству ссылок, уже считанных из потока, глубине вложенных вызововreadObjectилиreadUnshared, а также к зависящему от реализации количеству байтов, считанных из входного потока.Каждый вызов
readObjectилиreadUnsharedувеличивает глубину на 1 перед считыванием объекта и уменьшает её на 1 перед нормальным или исключительным возвратом. Начальное значение глубины —1; она увеличивается для каждого вложенного объекта и уменьшается при возврате каждого вложенного вызова. Начальное значение счётчика ссылок в потоке —1; он увеличивается перед считыванием объекта. - каждой ссылки на объект, ранее десериализованный из потока (class имеет значение
- Параметры:
-
filter- фильтр, может быть null - Вызывает исключение:
-
IllegalStateException- если объект уже был считан, если фабрика фильтров возвращаетnullпри ненулевом текущем фильтре или если фильтр уже был установлен. - Начиная с:
- 9
© 1993, 2025, 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/25/docs/api/java.base/java/io/ObjectInputStream.html