Module java.desktop
Package javax.print

Interface MultiDoc


public interface MultiDoc
接口MultiDoc指定了为打印作业提供多个打印数据的对象的接口。"Doc"是一个简短、易于发音的术语,表示"一段打印数据",而"multidoc"是几个doc的组合。客户端向打印作业传递一个实现了接口MultiDoc的对象,打印作业调用该对象的方法来获取打印数据。

接口MultiDoc提供了类似于"链表"的doc的抽象。一个multidoc对象就像链表中的一个节点,包含了列表中的当前doc和指向下一个节点(multidoc)的指针。打印作业可以调用multidoc的getDoc()方法来获取当前doc。当准备好继续下一个doc时,打印作业可以调用multidoc的next()方法来获取下一个multidoc,其中包含下一个doc。因此,访问multidoc的打印作业代码可能如下所示:

      void processMultiDoc(MultiDoc theMultiDoc) {

          MultiDoc current = theMultiDoc;

          while (current != null) {
              processDoc (current.getDoc());
              current = current.next();
          }
      }
 
当然,接口MultiDoc可以以任何满足合同的方式实现;在实现中不一定要使用链表。

为了获取multidoc打印作业的所有打印数据,打印服务代理可以使用以下两种模式之一:

  1. 交错模式:从当前multidoc获取doc。从当前doc获取打印数据表示对象。从打印数据表示对象获取所有打印数据。从当前multidoc获取下一个multidoc,并重复直到没有更多为止。(上面的代码示例使用了交错模式。)
  2. 一次性全部模式:从当前multidoc获取doc,并将doc保存在列表中。从当前multidoc获取下一个multidoc,并重复直到没有更多为止。然后遍历保存的doc列表。从当前doc获取打印数据表示对象。从打印数据表示对象获取所有打印数据。转到列表中的下一个doc,并重复直到没有更多为止。
现在,考虑一个正在动态生成打印数据且没有资源一次存储多个打印数据的打印客户端。如果打印服务代理使用一次性全部模式获取打印数据,那对于这样的客户端将会造成问题;客户端必须一直保留所有doc的打印数据,直到打印服务代理返回并请求它们,而客户端无法做到这一点。为了与这样的客户端一起工作,打印服务代理必须使用交错模式。

为了解决这个问题,并简化向打印作业提供多个doc的客户端的设计,每个支持multidoc打印作业的打印服务代理都必须使用交错模式访问MultiDoc对象。也就是说,给定一个MultiDoc对象,打印服务代理将调用getDoc()一次或多次,直到成功获取当前Doc对象。然后,打印服务代理将获取当前doc的打印数据,直到获取所有打印数据或发生不可恢复的错误为止。如果能够继续,打印服务代理将调用next()一次或多次,直到成功获取下一个MultiDoc对象或指示没有更多为止。接口MultiDoc的实现可以假定打印服务代理将遵循这种交错模式;对于任何其他使用模式,MultiDoc实现的行为是未指定的。

没有限制可以同时访问相同multidoc的客户端线程的数量。因此,所有实现MultiDoc接口的实现必须设计为多线程安全的。实际上,一个客户端线程可以在(概念上的)列表末尾添加doc,而一个打印作业线程可以同时从列表开头获取doc;只要multidoc对象正确同步线程,这两个线程就不会相互干扰。

  • Method Summary

    Modifier and Type
    Method
    Description
    Doc
    getDoc()
    获取当前doc对象。
    next()
    转到包含序列中下一个doc对象的multidoc对象。
  • Method Details

    • getDoc

      Doc getDoc() throws IOException
      获取当前doc对象。
      返回:
      当前doc对象
      抛出:
      IOException - 如果读取文档时发生错误
    • next

      MultiDoc next() throws IOException
      转到包含序列中下一个doc对象的multidoc对象。
      返回:
      包含下一个doc对象的multidoc对象,如果没有更多doc对象则返回null
      抛出:
      IOException - 如果定位下一个文档时发生错误