Класс ObjectInputStream
- Все реализованные интерфейсы:
-
Closeable,DataInput,ObjectInput,ObjectStreamConstants,AutoCloseable
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
Предупреждение: Десериализация недоверенных данных по своей природе небезопасна и должна быть избегаема. Недоверенные данные должны быть тщательно проверены в соответствии с разделом «Сериализация и десериализация» руководства по безопасной разработке Java SE Secure Coding Guidelines for 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:
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 со значением поля 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, Раздел 1.13, «Сериализация записей» для получения дополнительной информации.
- С момента:
- 1.1
- Внешние спецификации
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
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-битное число с плавающей точкой двойной точности. |
ObjectInputStream.GetField |
readFields() |
Считывает постоянные поля из потока и делает их доступными по имени. |
float |
readFloat() |
Считывает 32-битное число с плавающей точкой. |
void |
readFully |
Считывает байты, блокируя до тех пор, пока все байты не будут прочитаны. |
void |
readFully |
Считывает байты, блокируя до тех пор, пока все байты не будут прочитаны. |
int |
readInt() |
Считывает 32-битное целое число. |
String |
readLine() |
Устарело. Этот метод не корректно преобразует байты в символы. |
long |
readLong() |
Считывает 64-битное целое число. |
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() |
Считывает беззнаковый short 16-битный. |
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-фильтром для запрошенного фильтра. Если свойства фильтра сериализации или фабрики фильтра сериализации некорректны, будет брошено исключение 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.
Исключения выбрасываются при проблемах с потоком ввода и для классов, которые не должны быть десериализованы. Все исключения являются фатальными для потока ввода и оставляют его в неопределённом состоянии; вызывающей стороне необходимо игнорировать или восстанавливать состояние потока.
- Определяется в:
-
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.- Parameters:
-
desc- экземпляр классаObjectStreamClass - Returns:
- объект
Class, соответствующийdesc - Throws:
-
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.- Parameters:
-
interfaces- список имён интерфейсов, которые были десериализованы в описателе класса прокси - Returns:
- класс-прокси для указанных интерфейсов
- Throws:
-
IOException- любое исключение, сгенерированное базовымInputStream -
ClassNotFoundException- если класс-прокси или любой из указанных интерфейсов не найден - Since:
- 1.3
- See Also:
resolveObject
protected Object resolveObject(Object obj) throws IOException
Этот метод вызывается после того, как объект был прочитан, но перед тем, как он возвращён из readObject. Метод resolveObject по умолчанию просто возвращает тот же объект.
Когда подкласс заменяет объекты, он должен убедиться, что заменённый объект совместим с каждым полем, где будет храниться ссылка. Объекты, тип которых не является подклассом типа поля или элемента массива, прерывают десериализацию, вызывая исключение, и объект не сохраняется.
Этот метод вызывается только один раз, когда каждый объект встречается впервые. Все последующие ссылки на объект будут перенаправлены на новый объект.
- Parameters:
-
obj- объект, подлежащий замене - Returns:
- заменённый объект
- Throws:
-
IOException- Любое из стандартных исключений ввода/вывода.
enableResolveObject
protected boolean enableResolveObject(boolean enable)
resolveObject(java.lang.Object) вызывается для каждого десериализуемого объекта.- Parameters:
-
enable- true для включения использованияresolveObjectдля каждого десериализуемого объекта - Returns:
- предыдущее значение до вызова этого метода
readStreamHeader
protected void readStreamHeader() throws IOException, StreamCorruptedException
- Throws:
-
IOException- если при чтении из базового потока произошли ошибки ввода/вывода -
StreamCorruptedException- если информация управления в потоке не согласована
readClassDescriptor
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException
writeClassDescriptor). По умолчанию этот метод считывает описания классов в соответствии с форматом, определённым в спецификации сериализации объектов.- Returns:
- считанное описание класса
- Throws:
-
IOException- Если произошла ошибка ввода/вывода. -
ClassNotFoundException- Если класс сериализованного объекта, используемого в представлении описания класса, не найден - Since:
- 1.3
- See Also:
read
public int read() throws IOException
- Specified by:
-
readв интерфейсеObjectInput - Specified by:
-
readв классеInputStream - Returns:
- прочитанный байт или -1, если достигнут конец потока.
- Throws:
-
IOException- если произошла ошибка ввода/вывода.
read
public int read(byte[] buf, int off, int len) throws IOException
- Specified by:
-
readв интерфейсеObjectInput - Overrides:
-
readв классеInputStream - Parameters:
-
buf- буфер, в который считываются данные -
off- начальный смещение в целевом массивеbuf -
len- максимальное количество считанных байтов - Returns:
- общее количество байтов, считанных в буфер, или
-1, если больше нет данных из-за достижения конца потока. - Throws:
-
NullPointerException- еслиbufравноnull. -
IndexOutOfBoundsException- еслиoffотрицательно,lenотрицательно илиlenбольшеbuf.length - off. -
IOException- Если произошла ошибка ввода/вывода. - See Also:
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 - Исключения:
-
IllegalStateException- если объект был прочитан, если фабрика фильтров возвращаетnull, когда текущий фильтр не равен 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/io/ObjectInputStream.html