LibreOffice5(99)インプットストリーム、アウトプットストリーム、パイプの学習

2017-11-28

旧ブログ

t f B! P L
「ストリーム」の概念がよくわからなかったのですが、Streaming interfacesを読んでようやく理解できました。LibreOffice5(97)SimpleFileAccess、TextOutputStream、TextInputStream、Pipeのサービスとインターフェイスの一覧を参考にします。

前の関連記事:LibreOffice5(98)Javaの例:Universal Content Broker (UCB)をPythonにする:その1


datasource(データソース)とdatasink(データシンク)


datasource(データソース)

データをもっているオブジェクト。

datasink(データシンク)

データを受け取るオブジェクト。


データソースであるかデータシンクであるかは相対的なものでしかなく、例えばフィルターはデータシンクでもありデータソースでもあります。

inputstream(インプットストリーム)とoutputstream(アウトプットストリーム)


インプットストリームかアウトプットストリームかは自身に対してデータが入るか出るかの違いになります。

自身に対して入るデータはインプットストリーム、出るデータはアウトプットストリームになります。

自身にデータが入るということは自身はデータシンクということになります。

自身からデータが出るということは自身はデータソースになります。

自身にデータが入るということはデータソースからデータを読み込む(read)ことになります。

自身からデータを出すということはデータシンクにデータを書き込む(write)ことになります。

インプットストリームを図にするとこのようになります。

データシンクの立場からデータの流れを見ることになります。

このときのデータシンクをアクティブデータシンク、データソースをパッシブデータソースと呼びます。

XActiveDataSinkインターフェイスのsetInputStream()メソッドでXInputStream型のオブジェクトをデータソースにします。

TextInputStreamがデータシンクの場合は、readString()メソッドでデータソースから文字列を読み込みます。


アウトプットストリームを図にするとこのようになります。

データソースの立場からデータの流れをみることになります。

このときのデータソースをアクティブデータソース、データシンクをパッシブデータシンク、と呼びます。

XActiveDataSourceインターフェイスのsetOutputStream()メソッドでXOutputStream型のオブジェクトをデータシンクにします。

TextOutputStreamがデータソースの場合は、writeString()メソッドで文字列をデータシンクに書き込みます。

Pipeでアクティブデータソースとアクティブデータシンクを中継する


Pipeは能動的にデータを送り出したいアクティブデータソースと、能動的にデータを受け取りたいアクティブデータシンクとの間を取り持ってくれます。


PipeXOutputStreamXInputStreamももっているので、アウトプットストリームとしてもインプットストリームとしても振る舞えるので、パッシブデータシンクにもパッシブデータソースにもなれるわけです。
(LibreOffice5(100)埋め込みマクロを書きこむマクロの例参照。)


Pipeなどのバッファを使わず直接パッシブデータソースからデータを読み取って、パッシブデータシンクにデータを書き込む場合はこのようになります。
(LibreOffice5(108)ドキュメントストレージからファイルシステムストレージにデータをコピーする参照。)

一時ファイルのサービスとインターフェイスの一覧


TempFileサービスのインスタンスである一時ファイルもXOutputStreamXInputStreamももっており、Pipeと同様に使えます。


com.sun.star.io.TempFileをインスタンス化するとlinuxBean14.04では/tmpフォルダ下に.tmpとついたフォルダが作成されてその中に0バイトの一時ファイルが作成されました。

どこのフォルダに.tmpフォルダを作成するかは、LibreOfficeでツール→オプション、LibreOffice→パス、の「一時ファイル」で設定されています。

2つのファイルのうち一つはマクロを起動するときに開いたドキュメントのものです。

一時ファイルはスクリプトが終了すると消去されました。

.tmpとついたフォルダ名はLibreOfficeを終了すると消去されました。

LibreOfficeが起動している間は同じ.tmpフォルダが使われるようです。
def macro():
 ctx = XSCRIPTCONTEXT.getComponentContext()  # コンポーネントコンテクストの取得。
 smgr = ctx.getServiceManager()  # サービスマネージャーの取得。 
 tcu = smgr.createInstanceWithContext("pq.Tcu", ctx)  # サービス名か実装名でインスタンス化。
 tempfile = smgr.createInstanceWithContext("com.sun.star.io.TempFile", ctx)
 tcu.wtree(tempfile) 

├─.io.TempFile
│   └─.io.XTempFile
│      │   boolean  RemoveFile
│      │    string  ResourceName
│      │    string  Uri
│      ├─.io.XSeekable
│      │      hyper  getLength()
│      │      hyper  getPosition()
│      │       void  seek( [in] hyper location
│      │        ) raises ( .io.IOException,
│      │                   .lang.IllegalArgumentException)
│      └─.io.XStream
│             .io.XInputStream  getInputStream()
│            .io.XOutputStream  getOutputStream()
├─.beans.XPropertySet
│                         void  addPropertyChangeListener( [in]                         string aPropertyName,
│                                                          [in] .beans.XPropertyChangeListener xListener
│                                               ) raises ( .lang.WrappedTargetException,
│                                                          .beans.UnknownPropertyException)
│                         void  addVetoableChangeListener( [in]                         string PropertyName,
│                                                          [in] .beans.XVetoableChangeListener aListener
│                                               ) raises ( .lang.WrappedTargetException,
│                                                          .beans.UnknownPropertyException)
│      .beans.XPropertySetInfo  getPropertySetInfo()
│                          any  getPropertyValue( [in] string PropertyName
│                                      ) raises ( .lang.WrappedTargetException,
│                                                 .beans.UnknownPropertyException)
│                         void  removePropertyChangeListener( [in]                         string aPropertyName,
│                                                             [in] .beans.XPropertyChangeListener aListener
│                                                  ) raises ( .lang.WrappedTargetException,
│                                                             .beans.UnknownPropertyException)
│                         void  removeVetoableChangeListener( [in]                         string PropertyName,
│                                                             [in] .beans.XVetoableChangeListener aListener
│                                                  ) raises ( .lang.WrappedTargetException,
│                                                             .beans.UnknownPropertyException)
│                         void  setPropertyValue( [in] string aPropertyName,
│                                                 [in]    any aValue
│                                      ) raises ( .lang.WrappedTargetException,
│                                                 .lang.IllegalArgumentException,
│                                                 .beans.PropertyVetoException,
│                                                 .beans.UnknownPropertyException)
├─.io.XInputStream
│      long  available()
│      void  closeInput()
│      long  readBytes( [out] [byte] aData,
│                       [in]   long nBytesToRead
│            ) raises ( .io.IOException,
│                       .io.BufferSizeExceededException,
│                       .io.NotConnectedException)
│      long  readSomeBytes( [out] [byte] aData,
│                           [in]   long nMaxBytesToRead
│                ) raises ( .io.IOException,
│                           .io.BufferSizeExceededException,
│                           .io.NotConnectedException)
│      void  skipBytes( [in] long nBytesToSkip
│            ) raises ( .io.IOException,
│                       .io.BufferSizeExceededException,
│                       .io.NotConnectedException)
├─.io.XOutputStream
│      void  closeOutput()
│      void  flush()
│      void  writeBytes( [in] [byte] aData
│             ) raises ( .io.IOException,
│                        .io.BufferSizeExceededException,
│                        .io.NotConnectedException)
└─.io.XTruncate
        void  truncate()

参考にしたサイト


Streaming interfaces
LibreOfficeでのストリームの概念の解説。

OOoBasic/Generic/TemporaryFiles - ...?
一時ファイルの解説。

次の関連記事:LibreOffice5(100)埋め込みマクロを書きこむマクロの例

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ