Интерфейс MultiDoc
public interface MultiDoc
MultiDoc определяет интерфейс для объекта, который предоставляет более одного фрагмента данных печати для задания печати. «Doc» — это короткое и легко произносимое слово, обозначающее «фрагмент данных печати», а «multidoc» — группа нескольких doc. Клиент передает заданию печати объект, реализующий интерфейс MultiDoc, а задание печати вызывает методы этого объекта для получения данных печати. Интерфейс MultiDoc предоставляет абстракцию, аналогичную «связанному списку» документов. Объект multidoc подобен узлу в связанном списке, содержащему текущий документ в списке и указатель на следующий узел (multidoc) в списке. Задание печати может вызвать метод multidoc getDoc() для получения текущего документа. Когда оно готово перейти к следующему документу, задание печати может вызвать метод multidoc next() для получения следующего multidoc, который содержит следующий документ. Таким образом, код задания печати для доступа к multidoc может выглядеть так:
void processMultiDoc(MultiDoc theMultiDoc) {
MultiDoc current = theMultiDoc;
while (current != null) {
processDoc (current.getDoc());
current = current.next();
}
}
Конечно, интерфейс MultiDoc может быть реализован любым способом, который удовлетворяет контракту; он не обязан использовать связанный список в реализации. Для получения всех данных печати для задания печати multidoc служба печати может использовать один из двух шаблонов:
- Шаблон перемежающийся: Получить документ из текущего multidoc. Получить объект представления данных печати из текущего документа. Получить все данные печати из объекта представления данных печати. Получить следующий multidoc из текущего multidoc и повторить до тех пор, пока не останется больше. (Приведенный выше пример кода использует перемежающийся шаблон.)
- Шаблон все сразу: Получить документ из текущего multidoc и сохранить его в списке. Получить следующий multidoc из текущего multidoc и повторить до тех пор, пока не останется больше. Затем проитерироваться по списку сохраненных документов. Получить объект представления данных печати из текущего документа. Получить все данные печати из объекта представления данных печати. Перейти к следующему документу в списке и повторить до тех пор, пока не останется больше.
Для решения этой проблемы и упрощения проектирования клиентов, предоставляющих несколько документов заданию печати, каждая служба печати, поддерживающая задания печати multidoc, обязана получить доступ к объекту MultiDoc, используя перемежающийся шаблон. То есть, имея объект MultiDoc, служба печати вызовет getDoc() один или несколько раз, пока не получит текущий объект Doc. Затем служба печати получит данные печати текущего документа, не продолжая, пока не будут получены все данные печати или не произойдет невосстановимая ошибка. Если она может продолжить, служба печати затем вызовет next() один или несколько раз, пока не получит либо следующий объект MultiDoc, либо указание о том, что больше нет документов. Реализация интерфейса MultiDoc может предполагать, что служба печати будет следовать этому перемежающемуся шаблону; для любого другого шаблона использования поведение реализации MultiDoc не определено.
Нет ограничений на количество потоков клиентов, которые могут одновременно обращаться к одному и тому же multidoc. Следовательно, все реализации интерфейса MultiDoc должны быть спроектированы с учетом многопотоковой безопасности. На самом деле, поток клиента может добавлять документы в конец (мысленного) списка, в то время как поток задания печати одновременно получает документы с начала списка; при условии, что объект multidoc должным образом синхронизирует потоки, два потока не будут мешать друг другу.
Краткое описание методов
Подробное описание методов
getDoc
Doc getDoc() throws IOException
- Возвращает:
- текущий объект документа
- Выбрасывает:
-
IOException- если произошла ошибка при чтении документа
next
MultiDoc next() throws IOException
- Возвращает:
- объект multidoc, содержащий следующий объект документа, или
null, если больше нет объектов документов - Выбрасывает:
-
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.
https://download.java.net/java/early_access/jdk24/docs/api/java.desktop/javax/print/MultiDoc.html