Класс ObjectOutputStream
- Все реализуемые интерфейсы:
Closeable, DataOutput, Flushable, ObjectOutput, ObjectStreamConstants, AutoCloseable
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
В потоки можно записывать только объекты, поддерживающие интерфейс java.io.Serializable. Кодируется класс каждого сериализуемого объекта, включая имя класса и его сигнатуру, значения полей и массивов объекта, а также все объекты, на которые ссылаются исходные объекты.
Для записи объекта в поток используется метод writeObject. С помощью writeObject записывается любой объект, включая строки и массивы. В поток можно записать несколько объектов или примитивных значений. Объекты необходимо считывать из соответствующего ObjectInputstream в тех же типах и в том же порядке, в котором они были записаны.
Примитивные типы данных также можно записывать в поток с помощью соответствующих методов из DataOutput. Строки также можно записывать с помощью метода writeUTF.
Механизм сериализации объекта по умолчанию записывает класс объекта, сигнатуру класса и значения всех нетранзиентных и нестатических полей. Ссылки на другие объекты (кроме ссылок в транзиентных или статических полях) также приводят к записи этих объектов. Несколько ссылок на один объект кодируются с помощью механизма совместного использования ссылок, позволяющего восстановить графы объектов в том же виде, что и при исходной записи.
Например, чтобы записать объект, который можно прочитать примером из ObjectInputStream:
try (FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject("Today");
oos.writeObject(LocalDateTime.now());
} catch (Exception ex) {
// handle exception
}
Сериализуемые классы, требующие специальной обработки в процессе сериализации и десериализации, должны реализовать методы со следующими сигнатурами:
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException;
private void readObjectNoData()
throws ObjectStreamException;
Чтобы метод использовался при сериализации или десериализации, его имя, модификаторы, возвращаемый тип, а также количество и тип параметров должны точно совпадать. Методы должны объявлять возможность выбрасывания только проверяемых исключений, соответствующих этим сигнатурам.
Метод writeObject отвечает за запись состояния объекта для его конкретного класса, чтобы соответствующий метод readObject мог его восстановить. Метод не обязан учитывать состояние суперклассов или подклассов объекта. Состояние сохраняется путем записи отдельных полей в ObjectOutputStream с помощью метода writeObject или методов для примитивных типов данных, поддерживаемых DataOutput.
При сериализации не записываются поля объектов, не реализующих интерфейс java.io.Serializable. Подклассы объектов, не являющихся сериализуемыми, могут быть сериализуемыми. В этом случае у несериализуемого класса должен быть конструктор без аргументов, позволяющий инициализировать его поля. Тогда подкласс отвечает за сохранение и восстановление состояния несериализуемого класса. Часто поля этого класса доступны (public, package или protected) либо существуют методы get и set, которые можно использовать для восстановления состояния.
Сериализацию объекта можно предотвратить, реализовав методы writeObject и readObject, выбрасывающие NotSerializableException. ObjectOutputStream перехватит это исключение и прервет процесс сериализации.
Реализация интерфейса Externalizable позволяет объекту полностью управлять содержимым и форматом его сериализованного представления. Методы интерфейса Externalizable — writeExternal и readExternal — вызываются для сохранения и восстановления состояния объекта. При реализации классом эти методы могут записывать и считывать собственное состояние с помощью всех методов ObjectOutput и ObjectInput. Объекты отвечают за обработку любых изменений версий.
Константы перечисления сериализуются иначе, чем обычные сериализуемые или внешне сериализуемые объекты. Сериализованное представление константы перечисления состоит только из ее имени; значения полей константы не передаются. Для сериализации константы перечисления ObjectOutputStream записывает строку, возвращаемую методом name этой константы. Как и другие сериализуемые или внешне сериализуемые объекты, константы перечисления могут быть целями обратных ссылок, появляющихся далее в потоке сериализации. Процесс сериализации констант перечисления нельзя настроить; любые определенные типами перечислений методы writeObject и writeReplace, специфичные для класса, игнорируются при сериализации. Аналогично игнорируются объявления полей serialPersistentFields и serialVersionUID — для всех типов перечислений значение serialVersionUID фиксировано и равно 0L.
Примитивные данные, за исключением сериализуемых полей и внешне сериализуемых данных, записываются в ObjectOutputStream в записях блочных данных. Запись блочных данных состоит из заголовка и данных. Заголовок блочных данных содержит маркер и количество следующих за заголовком байтов. Последовательные записи примитивных данных объединяются в одну запись блочных данных. Размер блока для записи блочных данных составляет 1024 байта. Каждая запись блочных данных заполняется до 1024 байт либо записывается при выходе из режима блочных данных. Вызовы методов ObjectOutputStream writeObject, defaultWriteObject и writeFields сначала завершают текущую запись блочных данных, если она есть.
Записи сериализуются иначе, чем обычные сериализуемые или внешне сериализуемые объекты; см. раздел сериализация записей.
- Начиная с версии:
- 1.1
- Внешние спецификации
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
ObjectOutputStream.PutField |
Предоставляет программный доступ к постоянным полям, которые будут записаны в ObjectOutput. |
Краткое описание полей
Поля, объявленные в интерфейсе 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 | Модификатор и тип | Поле | Описание |
|---|---|---|
static final int |
baseWireHandle |
Первый дескриптор в потоке, который будет назначен. |
static final int |
PROTOCOL_VERSION_1 |
Версия протокола потока. |
static final int |
PROTOCOL_VERSION_2 |
Версия протокола потока. |
static final byte |
SC_BLOCK_DATA |
Битовая маска флага ObjectStreamClass. |
static final byte |
SC_ENUM |
Битовая маска флага ObjectStreamClass. |
static final byte |
SC_EXTERNALIZABLE |
Битовая маска флага ObjectStreamClass. |
static final byte |
SC_SERIALIZABLE |
Битовая маска флага ObjectStreamClass. |
static final byte |
SC_WRITE_METHOD |
Битовая маска флага ObjectStreamClass. |
static final SerializablePermission |
SERIAL_FILTER_PERMISSION |
Разрешает настройку системного фильтра сериализации. |
static final short |
STREAM_MAGIC |
Магическое число, записываемое в заголовок потока. |
static final short |
STREAM_VERSION |
Номер версии, записываемый в заголовок потока. |
static final SerializablePermission |
SUBCLASS_IMPLEMENTATION_PERMISSION |
Разрешает переопределение readObject и writeObject. |
static final SerializablePermission |
SUBSTITUTION_PERMISSION |
Разрешает замену одного объекта другим во время сериализации/десериализации. |
static final byte |
TC_ARRAY |
Новый массив. |
static final byte |
TC_BASE |
Первое значение тега. |
static final byte |
TC_BLOCKDATA |
Блок дополнительных данных. |
static final byte |
TC_BLOCKDATALONG |
Длинный блок данных. |
static final byte |
TC_CLASS |
Ссылка на класс. |
static final byte |
TC_CLASSDESC |
Новый дескриптор класса. |
static final byte |
TC_ENDBLOCKDATA |
Конец блоков дополнительных данных объекта. |
static final byte |
TC_ENUM |
Новая константа перечисления. |
static final byte |
TC_EXCEPTION |
Исключение при записи. |
static final byte |
TC_LONGSTRING |
Длинная строка. |
static final byte |
TC_MAX |
Последнее значение тега. |
static final byte |
TC_NULL |
Ссылка на объект null. |
static final byte |
TC_OBJECT |
Новый объект. |
static final byte |
TC_PROXYCLASSDESC |
Новый дескриптор класса-прокси. |
static final byte |
TC_REFERENCE |
Ссылка на объект, уже записанный в поток. |
static final byte |
TC_RESET |
Сброс контекста потока. |
static final byte |
TC_STRING |
Новая строка. |
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Предоставляет подклассам, полностью переопределяющим ObjectOutputStream, возможность не выделять память под закрытые данные, используемые только данной реализацией ObjectOutputStream. |
|
| Создает ObjectOutputStream, записывающий данные в указанный OutputStream. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
protected void |
annotateClass |
Подклассы могут реализовать этот метод, чтобы сохранять данные класса в потоке. |
protected void |
annotateProxyClass |
Подклассы могут реализовать этот метод, чтобы сохранять в потоке пользовательские данные вместе с дескрипторами динамических классов-прокси. |
void |
close() |
Закрывает поток. |
void |
defaultWriteObject() |
Записывает в этот поток нестатические и нетранзиентные поля текущего класса. |
protected void |
drain() |
Записывает все буферизованные данные в ObjectOutputStream. |
protected boolean |
enableReplaceObject |
Разрешает потоку заменять объекты, записываемые в него. |
void |
flush() |
Сбрасывает буфер потока. |
ObjectOutputStream.PutField |
putFields() |
Возвращает объект, используемый для буферизации постоянных полей, которые будут записаны в поток. |
protected Object |
replaceObject |
Этот метод позволяет доверенным подклассам ObjectOutputStream заменять один объект другим во время сериализации. |
void |
reset() |
Сброс позволяет не учитывать состояние любых объектов, уже записанных в поток. |
void |
useProtocolVersion |
Задает версию протокола потока, используемую при его записи. |
void |
write |
Записывает массив байтов. |
void |
write |
Записывает часть массива байтов. |
void |
write |
Записывает байт. |
void |
writeBoolean |
Записывает значение boolean. |
void |
writeByte |
Записывает 8-битное значение byte. |
void |
writeBytes |
Записывает String как последовательность байтов. |
void |
writeChar |
Записывает 16-битное значение char. |
void |
writeChars |
Записывает String как последовательность символов. |
protected void |
writeClassDescriptor |
Записывает указанный дескриптор класса в ObjectOutputStream. |
void |
writeDouble |
Записывает 64-битное значение double. |
void |
writeFields() |
Записывает буферизованные поля в поток. |
void |
writeFloat |
Записывает 32-битное значение float. |
void |
writeInt |
Записывает 32-битное значение int. |
void |
writeLong |
Записывает 64-битное значение long. |
final void |
writeObject |
Записывает указанный объект в ObjectOutputStream. |
protected void |
writeObjectOverride |
Метод, используемый подклассами для переопределения метода writeObject по умолчанию. |
void |
writeShort |
Записывает 16-битное значение short. |
protected void |
writeStreamHeader() |
Метод writeStreamHeader предоставлен для того, чтобы подклассы могли добавлять собственный заголовок в начало или конец потока. |
void |
writeUnshared |
Записывает в ObjectOutputStream объект без совместного использования ссылок. |
void |
writeUTF |
Запись примитивных данных этой строки в формате модифицированной UTF-8. |
Методы, объявленные в классе OutputStream
nullOutputStream | Модификатор и тип | Метод | Описание |
|---|---|---|
static OutputStream |
nullOutputStream() |
Возвращает новый OutputStream, отбрасывающий все байты. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создает и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли какой-либо другой объект этому объекту. |
protected void |
finalize() |
Устарело и подлежит удалению: этот элемент API может быть удален в будущей версии. Финализация объявлена устаревшей и подлежит удалению в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Переводит текущий поток в состояние ожидания до его пробуждения, обычно в результате вызова notify или interrupt. |
final void |
wait |
Переводит текущий поток в состояние ожидания до его пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Переводит текущий поток в состояние ожидания до его пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
Подробное описание конструкторов
ObjectOutputStream
public ObjectOutputStream(OutputStream out) throws IOException
- Параметры:
-
out— выходной поток для записи - Исключения:
-
IOException— если при записи заголовка потока произошла ошибка ввода-вывода -
NullPointerException— еслиoutравноnull - С версии:
- 1.4
- См. также:
ObjectOutputStream
protected ObjectOutputStream() throws IOException
- Исключения:
-
IOException— если при создании этого потока произошла ошибка ввода-вывода
Подробное описание методов
useProtocolVersion
public void useProtocolVersion(int version) throws IOException
Этот метод предоставляет возможность текущей версии Serialization записывать данные в формате, обратно совместимом с предыдущей версией формата потока.
Будут приложены все усилия, чтобы не вводить дополнительные нарушения обратной совместимости; однако иногда другого выхода нет.
- Параметры:
-
version— используйте ProtocolVersion из java.io.ObjectStreamConstants. - Исключения:
-
IllegalStateException— если вызван после сериализации любых объектов. -
IllegalArgumentException— если передана недопустимая версия. -
IOException— если произошла ошибка ввода-вывода - С версии:
- 1.2
- См. также:
writeObject
public final void writeObject(Object obj) throws IOException
Исключения возникают при проблемах с OutputStream и для классов, которые не должны сериализоваться. Все исключения являются фатальными для OutputStream, который остается в неопределенном состоянии; вызывающая сторона должна решить, игнорировать ли состояние потока или попытаться его восстановить.
- Определено в:
-
writeObjectв интерфейсеObjectOutput - Параметры:
-
obj— записываемый объект - Исключения:
-
InvalidClassException— проблема с классом, используемым при сериализации. -
NotSerializableException— сериализуемый объект не реализует интерфейс java.io.Serializable. -
IOException— любое исключение, выброшенное базовым OutputStream.
writeObjectOverride
protected void writeObjectOverride(Object obj) throws IOException
- Параметры:
-
obj— объект для записи в базовый поток - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода - С версии:
- 1.2
- См. также:
defaultWriteObject
public void defaultWriteObject() throws IOException
- Исключения:
-
IOException— если при записи в базовыйOutputStreamпроизошла ошибка ввода-вывода
putFields
public ObjectOutputStream.PutField putFields() throws IOException
- Возвращает:
- экземпляр класса Putfield, содержащий сериализуемые поля
- Исключения:
-
IOException— если произошла ошибка ввода-вывода - С версии:
- 1.2
writeFields
public void writeFields() throws IOException
- Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода -
NotActiveException— если метод writeObject класса не был вызван для записи состояния объекта. - С версии:
- 1.2
reset
public void reset() throws IOException
- Исключения:
-
IOException— если reset() вызван во время сериализации объекта.
annotateClass
protected void annotateClass(Class<?> cl) throws IOException
- Параметры:
-
cl— класс, для которого требуется добавить пользовательские данные - Исключения:
-
IOException— любое исключение, выброшенное базовым OutputStream.
annotateProxyClass
protected void annotateProxyClass(Class<?> cl) throws IOException
Этот метод вызывается ровно один раз для каждого уникального дескриптора класса-прокси в потоке. Реализация этого метода по умолчанию в ObjectOutputStream ничего не делает.
Соответствующий метод в ObjectInputStream — resolveProxyClass. Для данного подкласса ObjectOutputStream, переопределяющего этот метод, метод resolveProxyClass соответствующего подкласса ObjectInputStream должен читать любые данные или объекты, записанные методом annotateProxyClass.
- Параметры:
-
cl— класс-прокси, для которого требуется добавить пользовательские данные - Исключения:
-
IOException— любое исключение, выброшенное базовымOutputStream - С версии:
- 1.3
- См. также:
replaceObject
protected Object replaceObject(Object obj) throws IOException
Метод ObjectOutputStream.writeObject принимает параметр типа Object (а не типа Serializable), чтобы допускать случаи, когда несериализуемые объекты заменяются сериализуемыми.
При подмене объектов подкласс должен гарантировать, что во время десериализации будет выполнена соответствующая подмена или что подставляемый объект совместим с каждым полем, в котором будет сохранена ссылка. Объекты, тип которых не является подтипом типа поля или элемента массива, прерывают сериализацию, вызывая исключение, и не сохраняются.
Этот метод вызывается только один раз при первом обнаружении каждого объекта. Все последующие ссылки на объект будут перенаправлены на новый объект. Этот метод должен возвращать подставляемый объект или исходный объект.
В качестве подставляемого объекта можно вернуть null, однако это может привести к возникновению NullPointerException в классах, содержащих ссылки на исходный объект, если они ожидают объект, а не null.
- Параметры:
-
obj— объект для подмены - Возвращает:
- альтернативный объект, заменивший указанный
- Исключения:
-
IOException— любое исключение, выброшенное базовым OutputStream.
enableReplaceObject
protected boolean enableReplaceObject(boolean enable)
replaceObject(Object) вызывается для каждого сериализуемого объекта.- Параметры:
-
enable— значение true разрешает использованиеreplaceObjectдля каждого сериализуемого объекта - Возвращает:
- предыдущее значение настройки до вызова этого метода
writeStreamHeader
protected void writeStreamHeader() throws IOException
- Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
writeClassDescriptor
protected void writeClassDescriptor(ObjectStreamClass desc) throws IOException
readClassDescriptor, следует переопределить, чтобы восстановить дескриптор класса из его пользовательского представления в потоке. По умолчанию этот метод записывает дескрипторы классов в соответствии с форматом, определенным в Спецификации сериализации объектов Java. Обратите внимание: этот метод вызывается только в том случае, если ObjectOutputStream не использует старый формат потока сериализации (устанавливаемый вызовом метода useProtocolVersion класса ObjectOutputStream). Если этот поток сериализации использует старый формат (PROTOCOL_VERSION_1), дескриптор класса записывается внутренним способом, который нельзя переопределить или настроить.
- Параметры:
-
desc— дескриптор класса для записи в поток - Исключения:
-
IOException— если произошла ошибка ввода-вывода. - С версии:
- 1.3
- Внешние спецификации
- См. также:
write
public void write(int val) throws IOException
- Определено в:
-
writeв интерфейсеDataOutput - Определено в:
-
writeв интерфейсеObjectOutput - Определено в:
-
writeв классеOutputStream - Параметры:
-
val— байт для записи в поток - Исключения:
-
IOException— если произошла ошибка ввода-вывода.
write
public void write(byte[] buf) throws IOException
- Определено в:
-
writeв интерфейсеDataOutput - Определено в:
-
writeв интерфейсеObjectOutput - Переопределено:
-
writeв классеOutputStream - Параметры:
-
buf— записываемые данные - Исключения:
-
IOException— если произошла ошибка ввода-вывода. - См. также:
write
public void write(byte[] buf, int off, int len) throws IOException
- Определено в:
-
writeв интерфейсеDataOutput - Определено в:
-
writeв интерфейсеObjectOutput - Переопределено:
-
writeв классеOutputStream - Параметры:
-
buf— записываемые данные -
off— начальное смещение в данных -
len— количество записываемых байтов - Исключения:
-
IOException— если произошла ошибка ввода-вывода. В частности,IOExceptionвыбрасывается, если выходной поток закрыт. -
IndexOutOfBoundsException— еслиoffотрицательно,lenотрицательно илиlenбольше, чемb.length - off
flush
public void flush() throws IOException
- Определено в:
-
flushв интерфейсеFlushable - Определено в:
-
flushв интерфейсеObjectOutput - Переопределено:
-
flushв классеOutputStream - Исключения:
-
IOException— если произошла ошибка ввода-вывода.
drain
protected void drain() throws IOException
- Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
close
public void close() throws IOException
- Определено в:
-
closeв интерфейсеAutoCloseable - Определено в:
-
closeв интерфейсеCloseable - Определено в:
-
closeв интерфейсеObjectOutput - Переопределено:
-
closeв классеOutputStream - Исключения:
-
IOException— если произошла ошибка ввода-вывода.
writeBoolean
public void writeBoolean(boolean val) throws IOException
- Определено в:
-
writeBooleanв интерфейсеDataOutput - Параметры:
-
val— записываемое логическое значение - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
writeByte
public void writeByte(int val) throws IOException
- Определено в:
-
writeByteв интерфейсеDataOutput - Параметры:
-
val— записываемое значение байта - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
writeShort
public void writeShort(int val) throws IOException
- Определено в:
-
writeShortв интерфейсеDataOutput - Параметры:
-
val— записываемое значение short - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
writeChar
public void writeChar(int val) throws IOException
- Определено в:
-
writeCharв интерфейсеDataOutput - Параметры:
-
val— записываемое значение char - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
writeInt
public void writeInt(int val) throws IOException
- Определено в:
-
writeIntв интерфейсеDataOutput - Параметры:
-
val— записываемое целочисленное значение - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
writeLong
public void writeLong(long val) throws IOException
- Определено в:
-
writeLongв интерфейсеDataOutput - Параметры:
-
val— записываемое значение long - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
writeFloat
public void writeFloat(float val) throws IOException
- Определено в:
-
writeFloatв интерфейсеDataOutput - Параметры:
-
val— записываемое значение float - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
writeDouble
public void writeDouble(double val) throws IOException
- Определено в:
-
writeDoubleв интерфейсеDataOutput - Параметры:
-
val— записываемое значение double - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
writeBytes
public void writeBytes(String str) throws IOException
- Определено в:
-
writeBytesв интерфейсеDataOutput - Параметры:
-
str— строка байтов для записи - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
writeChars
public void writeChars(String str) throws IOException
- Определено в:
-
writeCharsв интерфейсеDataOutput - Параметры:
-
str— строка символов для записи - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
writeUTF
public void writeUTF(String str) throws IOException
- Определено в:
-
writeUTFв интерфейсеDataOutput - Параметры:
-
str— записываемая строка - Исключения:
-
IOException— если при записи в базовый поток произошла ошибка ввода-вывода
© 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.