• 検索結果がありません。

Java における入出力と XML 2011 年 5 月 15 日 海谷治彦 1

N/A
N/A
Protected

Academic year: 2021

シェア "Java における入出力と XML 2011 年 5 月 15 日 海谷治彦 1"

Copied!
30
0
0

読み込み中.... (全文を見る)

全文

(1)

Javaにおける入出力とXML

2011年5月15日

海谷 治彦

(2)

目次

• 入出力の抽象化

• ファイル入出力の概要

• XMLEncoder/Decoder

(3)

データと情報

データ

情報

人間による意味付け の無いもの. CDの上の0/1列等. 磁気や突起等の物理情報 人間による意味付け の有るもの. 音楽,絵画,図書等.

(4)

情報処理と入出力

• 計算機では直接に情報は入出力できない.

• 意味付けの無いデータとして扱うしかない.

• 情報をデータに変換する作業のかなりの

部分は人間が明示的にプログラミングしな

いといけない・・・

(5)

• 音声

– Linier PCM や MP3等,音声情報をデータとして記述 する規格が存在する. – 専門じゃないので詳細はわかりません.

• 画像

– 同様にjpegやgif等,画像情報をデータとして記述する 規格.

• 図書,文書

– 通常は文字列として扱う. – MSワードやPDF等も文書情報をデータとして記述す る規格の例.

(6)

OSのファイルシステム

• (ご存知の通り,ほとんどの)OSは木構造

のファイルシステムを持つ.

• 木の葉: ファイル

• 木の中間ノード: フォルダもしくはディレクト

• J2SEは一般的なOSのファイルシステムを

扱うAPIを備えている.

(7)

UNIX系ファイルシステムの概要

文献5 p.15

ご存知のとおり,UNIX系OS(その他も大抵そうだけど) は,階層的なファイルシステムを持っている.

/

dev home bin usr

fd0 hda ls cp

・・・・ ・・・・ OSのスライドから抜粋

(8)

mountの概念図

文献1 p.45 改

/

etc usr home

b

kaiya miyao takei

bin local / etc usr home bin local bをhomeに マウントする b

kaiya miyao takei

(9)

mountの実際

/ (hda1) (hdb1) (hdc) (fd0) (hda3) /home /usr /mnt /cdtest OSのスライドから抜粋

(10)

外部データと内部データと情報

外部データ

情報

内部データ

int x, y, z;

class Foo extends Bar{ String sakana=“x”; };

(11)

内部データ(変数)の役割

• コンピュータによる情報処理では直接に外

部データを操作できない(わけじゃないけど,

効率が悪い).

• 比較的早いメモリ上のデータ(変数)を操作

して処理をするのが普通.

• 結局,

入出力とは内部データと外部データ

を相互に変換する作業.

• この変換作業の手間を減らせればうれし

い.

(12)

文字列: データ? 情報?

• JavaのStringは明らかにデータである.

• しかし,その字面を人間が解釈して(ある意味勝

手に,しかし多くの人間間で共通理解を与えつつ)

意味付けをすることができる.

• その意味で,文字列データは情報に近いものと

考えられる.

• その意味でデータを(情報に近い形で保存するに

は)文字列が都合よい.

(13)

文字ストリーム

ファイル名: String : FileReader : BufferedReader readLine() close() : FileWriter : BufferedWriter write(...) close() : PrintWriter println(...) close() 読み 出し 側 書き出し 側 テキストファイルの読 み書きに良く使われ るクラス呼び出し連 鎖.

(14)

Stdioからの読み書き

ファイル名: String : FileReader : BufferedReader readLine() close() : FileWriter : BufferedWriter write(...) close() : PrintWriter println(...) close() : InputStreamReader System.in: InputStream System.out: PrintStream println(...) close()

(15)

バイトストリーム

ファイル名: String : FileInputStream : FileOutputStream : BufferedInputStream int read() close() : BufferedOutputStream write(int) close() バイト列(データ列)の 読み書きに関する典 型的な呼び出し連鎖.

(16)

入出力クラスの基本

• 基点はファイル名やストリーム.

• ストリーム: データの流れを示す抽象概念.

– 詳細はOSの授業にてやります.

• いくつかのクラスを連鎖することで,扱う対

象が単なるデータから情報に近くなってい

く.

– 単なるbit列から文字列になったりする.

(17)

XMLEncoder/Decoder

• Javaのオブジェクト(インスタンス)を手っ取

り早く外部データ化するAPI.

• この外部データ化することを「永続化」と呼

ぶ.

– ファイルに保存とか,プログラム同士のデータ

交換とか.

(18)

XML

• Extensible Markup Languageの略らしい.

– 何故 EMLじゃないの? 謎.

• 要はラベルのついた箇条書きの文字列データ.

• Cの構造体やJavaのメンバ属性等,構造化,グルー

プ化されたデータを扱うのに便利.

• 流行・・・・

• XML文書を処理するためのAPIがどの言語でも

豊富にある.

• あとはGoogleにでも聞いてください.

(19)

XMLEncode/Decodeの要件・利点

以下の要件を満たすクラスでないとなら

ない.

1. 無引数のpublicコンストラクタを持つ.

2. 永続化したい属性にはsetter/getterがある.

利点

永続化形式をプログラマが決めなくてもよい.

• Cの演習でリスト構造のファイル保存形式を決め るような面倒はスキップできる.

あるオブジェクトを永続化すれば,参照され

ているオブジェクトも一緒に永続化される.

• 無論,永続化の要件を満たさないとダメだけど.

(20)

Setter/Getter

ある属性の値を設定(set)したり,獲得し

たり(get)したりするためのメソッド.

アクセッサー(accesssors)とも呼ばれる.

属性の名前に従い,定められたメソッド

名でないと

いけない

属性名 abc

setter ⇒ setAbc

getter ⇒ getAbc

(21)

XMLEncoder/Decoderの連鎖

ファイル名: String : FileInputStream exetnds InputStream : FileOutputStream extends OutputStream : BufferedInputStream int read() close() : BufferedOutputStream write(int) close() :XMLDecoder readObject() close() : XMLEncoder writeObject() close()

(22)

無論,標準IOからもできます

: BufferedInputStream int read() close() : BufferedOutputStream write(int) close() :XMLDecoder readObject() close() : XMLEncoder writeObject() close()

System.in: InputStream System.out: PrintStream

PrintStream OutputStream

(23)

例題(XMLEncText1)の構造

mainメソッド Aのオブジェクトを保存すれば, Bも自動的に保存される. たたし,A, Bそれぞれ永続化の条件を満たす場合. 型Aの オブジェクト “sakana” 型Bの オブジェクト “tako”

(24)

例題(XMLEncText2)の構造

mainメソッド 配列およびArrayListに対応している. 型Aの オブジェクト “sakana” 型Bの オブジェクト “tako” 型Cのオブジェクト “kani0” 型Cのオブジェクト “kani1” 型Cのオブジェクト “kani2” 型Cのオブジェクト “ebi0” 型Cのオブジェクト “ebi1” 型Cのオブジェクト “ebi2” 型Cのオブジェクト “ebi3” 配列で実装 ArrayListで実装

(25)

Swingの永続化

• 別に自分で保存形式をきめてもいい.

• しかし,XMLEncoder等を使うと凄く簡単に

保存復元ができる.

• 特に,比較的トップレベルのJPanelから保

存してしまえば,その上に乗っかっている

部品もいもづるに保存される.

• 永続化条件を満たせば,Listener等も保存

される.

• 例題(XMLEncDecSwing2)を参照.

(26)

例題の永続化された構造

JPanel0: JPanel : JButton JScrollPane0: JScrollPane : Rectangle : SaveAdapter : Rectangle : TextArea : NullLayout2 null: LayoutManager このオブジェクト を保存すると他 も保存される. 他のオブジェクトから参照されるオブジェクトには名前(id)がある. source source listener listener

(27)

永続化構造の条件

• 保存するオブジェクト以下の参照関係が閉じてい

ること.

– 前ページはOK – 以下はダメ JPanel0: JPanel : JButton JScrollPane0: JScrollPane : NullLayout2 null: LayoutManager このオブジェクト を保存すると他 も保存される. source listener 他のPanel: JPanel 上記の パネルが マズい ※ 絶対ダメというわけじゃないが, 復元のプログラムが複雑になる.

(28)

例題 XMLEncDecArrayCollection1

• Genericsに基づくCollectionを使ってみた.

• 大学には学部がいくつかあり,学生が幾人

かいる.

• 学部は簡単に変化しないので,配列で実

装.

• 学生は流動的なのでArrayListで実装.

• out.xml というファイルにデータを保存する

ように実装.

(29)

例題のメモリーイメージ

: University name = 情報 : Department name = 電気 : Department name = 機械 : Department id = 1 name = 田中 : Student id = 2 name = 山田 : Student id = 3 name = 佐伯 : Student id = 4 name = 森田 : Student id = 5 name = 鈴木 : Student : ArrayList dept dept dept dept dept Load

(30)

XMLEncoder/Decoder の利点

• インスタンスをプログラマがテキスト列等に展開・

復元する手間が不要です.

• XML表現なので他の言語(perlやc等)でも作成し

たデータを容易に扱えます.

– ただし,XML対応のAPIが整備されている場合.

• 複雑ではありますが,テキストファイルなので,ファ

イルの中身を目視確認できます.

• この授業の演習ではなるだけ

XMLEncoder/Decoderを使ってみてください.

参照

関連したドキュメント

In this diagram, there are the following objects: myFrame of the Frame class, myVal of the Validator class, factory of the VerifierFactory class, out of the PrintStream class,

 当第2四半期連結累計期間(2022年3月1日から2022年8月31日)におけるわが国経済は、ウクライナ紛争長期化

パキロビッドパックを処方入力の上、 F8特殊指示 →「(治)」 の列に 「1:する」 を入力して F9更新 を押下してください。.. 備考欄に「治」と登録されます。

入庫 出庫 残 日付 入庫 出庫 残 日付 入庫 出庫 残.

それは10月31日の渋谷に於けるハロウィンのことなのです。若者たちの仮装パレード

  明治 27 年(1894)4 月、地元の代議士が門司港を特別輸出入港(※)にするよう帝国議 会に建議している。翌年

大正13年 3月20日 大正 4年 3月20日 大正 4年 5月18日 大正10年10月10日 大正10年12月 7日 大正13年 1月 8日 大正13年 6月27日 大正13年 1月 8日 大正14年 7月17日 大正15年

② 入力にあたっては、氏名カナ(半角、姓と名の間も半角で1マス空け) 、氏名漢 字(全角、姓と名の間も全角で1マス空け)、生年月日(大正は