Top > OOoBasic > Generic > textfile
*テキストファイルの読み書き [#d94d0aa5]
com.sun.star.ucb.SimpleFileAccess サービスを利用したファイルへのアクセスに加えて com.sun.star.io.TextInputStream サービスを利用することでテキストファイルを読み込むことができます。書き込みには com.sun.star.io.TextOutputStream サービスを利用します。

#contents

**読み込み [#c0cae755]

読み込みについてです。

***TextInputStream サービス [#u29beb4e]

テキストファイルの読み込みには com.sun.star.io.TextInputStream サービスが必要です。CreateUnoService 関数を利用してサービスをインスタンス化します。

 Dim oInputStream As Object
   oInputStream = CreateUnoService("com.sun.star.io.TextInputStream")

***読み込みストリームの設定 [#qa87f324]

読み込むデータストリームを設定します。

データストリームは [[ファイルへのアクセス>../file]] で利用した com.sun.star.ucb.SimpleFileAccess サービスから取得します。

読み込みのためのデータストリームは読み込み専用でファイルを開くために,SimpleFileAccess サービスの ''openFileRead'' メソッドから XInputStream インターフェースを取得します。

 Dim oFileAcc As Object
 Dim oInputStream As Object
  oFileAcc = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
  oInputStream = CreateUnoService("com.sun.star.io.TextInputStream")

そしてそのインターフェースを TextInputStream オブジェクトに ''setInputStream'' メソッドで読み込みデータストリームとして設定します。

 Dim vData As Variant
 vData = oFileAcc.openFileRead(sUrl)
 oInputStream.setInputStream(vData)

***行ごとの読み込み [#t63dfe69]
一行ごとにファイルから読み込むためには ''readLine'' メソッドを使用します。

 sLine = oInputStream.readLine()
 MsgBox sLine

とすることで,ファイルの内容を一行読み込むことができます。''readLine'' メソッドで一行読み込むと,LF や CR といった改行に使用される行末の文字が削除されます。

ファイルの内容をファイルの最後まで順に読み込んでいく場合には,ファイルの終端に来ているかどうかを調べるメソッド ''isEOF'' を併用します。この ''isEOF'' メソッドは,読み込む位置がファイルの終端の場合に true を戻します。

次のようにすることでファイルを一行ずつ順にファイルの終端まで読み込むことができます。

 While NOT oInputStream.isEOF()
   sLine = oInputStream.readLine()
   sDataLine = sDataLine & sLine & Chr(10)
 WEnd

''readLine'' メソッドでは戻される文字列に対して改行コードが削除されているので,追加してやる必要があります。例えば,CR+LF なら Chr(13) & Chr(10) 。

***ファイルを閉じる [#f084c6d4]
読み込みが終わって必要のなくなったファイルのインプットストリームは閉じておく必要があります。これには ''closeInput'' メソッドを使用します。

 oInputStream.closeInput()

***エンコードの指定 [#s0b59f53]
テキストファイルから文字列を読み込む際に,日本語などではエンコードが問題になってくることがあります。そのために,読み込むエンコードを指定してテキストファイルを読み込むことができます。

エンコードの指定に使用するメソッドは ''setEncoding'' メソッドです。このメソッドは指定したい文字コードを文字列で指定します。

 oInputStream.setEncoding( "SJIS" )

のようにします。

***その他 [#h0a48fc9]
次の関数 FileLoader は,ファイルの Url を与えるとファイルが存在すればテキストファイルを読み込んで文字列として内容を戻します。

 Function FileLoader(sUrl As String) As String
 Dim sLine As String, sDataLine As String
 Dim oFileAcc As Object, oInputStream As Object
 Dim vData As Variant
   oFileAcc = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
   oInputStream = CreateUnoService("com.sun.star.io.TextInputStream")
   If oFileAcc.exists(sUrl) Then
     vData = oFileAcc.openFileRead(sUrl)
     oInputStream.setInputStream(vData)
     While NOT oInputStream.isEOF()
       sLine = oInputStream.readLine()
       sDataLine = sDataLine & sLine & Chr(10)
     WEnd
     oInputStream.closeInput()
     FileLoader = sDataLine
   End if
 End Function

**書き込み [#ja9d5bcb]
書き込みについてです。
***TextOutputStream サービス [#ta63c706]
テキストの書き込みには TextOutPutStream サービスを使用します。''CreateUnoService'' 関数を利用してサービスをインスタンス化します。

 Dim oOutPutStream As Object
   oOutPutStrem = CreateUnoService("com.sun.star.io.TextOutputStream")

***書き込みストリームの設定 [#j33156f6]
ファイルへ書き込むためのストリームを取得,設定します。

データストリームは ファイルへのアクセス で利用した com.sun.star.ucb.SimpleFileAccess サービスから取得します。

書き込むためには,ファイルを書き込める状態で開いてやります。SimpleFileAccess サービスの openFileWrite メソッドから XOutputStream インターフェースを取得します。

 Dim oFileAcc As Object
 Dim oOutputStream As Object
   oFileAcc = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
   oOutputStream = CreateUnoService("com.sun.star.io.TextOutputStream")

そしてそのインターフェースを TextOutputStream オブジェクトに setOutputStream メソッドで読み込みデータストリームとして設定します。

 Dim vData As Variant
   vData = oFileAcc.openFileWrite(sUrl)
   oOutputStream.setOutputStream(vData)

***書き込み [#c0e5775e]
ファイルへ書き込むために ''writeString'' メソッドを利用します。

 oOutputStream.writeString( "Something to write" )

この ''writeString'' メソッドでは,改行は手動で追加してやる必要があります。

 oOutputStream.writeString( "Something to write!" & Chr(10) & "Nothing." )

ここでは,LF を追加してみました。

***ファイルを閉じる [#y5ddacc0]
書き込まなくなったファイルは閉じておく必要があります。''closeOutput'' メソッドでアウトプットストリームを閉じてやります。

 oOutputStream.closeOutput()


***エンコードの設定 [#y7f7d164]
書き込みの際にも,日本語などの言語の文字を書き込む際にはエンコードを設定してやる必要があります。このためには,''setEncoding'' メソッドを使用します。

 oOutputStream.setEncoding( "UTF-8" )

のようにします。(UTF-8 はデフォルトの設定と同じです。)

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes