WEBVTT

00:00:00.400 --> 00:00:05.360 align:middle
こんにちは、このコースでは
ストリームライブラリについてお話します。

00:00:05.520 --> 00:00:07.840 align:middle
ストリームは Pharo の
基本的な特徴の1つです。

00:00:09.240 --> 00:00:13.480 align:middle
ストリームが何で、どう使うか、
いつ使うと便利かを見ていきましょう。

00:00:14.880 --> 00:00:16.200 align:middle
ストリームとは何でしょう？

00:00:16.360 --> 00:00:17.840 align:middle
ストリームオブジェクトは

00:00:18.000 --> 00:00:22.200 align:middle
コレクションのような要素列を

00:00:22.360 --> 00:00:24.240 align:middle
列挙することを可能にします。

00:00:24.400 --> 00:00:28.040 align:middle
この要素列はメモリ中のコレクション
かもしれませんし

00:00:28.800 --> 00:00:34.320 align:middle
ネットワークから流れてくるかもしれませんし
ファイル等かもしれません。

00:00:36.120 --> 00:00:39.320 align:middle
ストリームはメモリ中に
現在位置を保持します。

00:00:40.000 --> 00:00:44.200 align:middle
ストリームを使う時には
前に進めたり戻ったりしながら

00:00:44.360 --> 00:00:46.920 align:middle
ストリームを読んだり書いたりします。

00:00:47.600 --> 00:00:50.760 align:middle
ストリームの API の全体図です。

00:00:50.920 --> 00:00:54.680 align:middle
ストリームを作るためには
いくつかのオブジェクトは

00:00:55.520 --> 00:01:00.200 align:middle
readStream や writeStream
というメッセージを使って

00:01:01.000 --> 00:01:02.880 align:middle
ストリームを作ることができます。

00:01:03.040 --> 00:01:06.800 align:middle
（例えば、ファイルやコレクションから）

00:01:07.880 --> 00:01:10.480 align:middle
こうしてストリームを作ることができます。

00:01:11.760 --> 00:01:16.560 align:middle
この streamContents: メッセージが
Collection に送られて

00:01:16.720 --> 00:01:19.120 align:middle
ブロックが引数として渡されます。
ブロックはストリームを受け取ります。

00:01:19.680 --> 00:01:23.840 align:middle
このブロックの中でストリームを使って
コレクションを作ります。

00:01:24.000 --> 00:01:27.800 align:middle
streamContents: メソッドが
そのコレクションを返します。

00:01:27.960 --> 00:01:30.400 align:middle
このメソッドの使い方は
終わりのほうで見ることになります。

00:01:31.440 --> 00:01:35.160 align:middle
この場合は、

00:01:35.320 --> 00:01:38.680 align:middle
readStream か writeStream か
ReadWriteStream クラスに直接たのんで

00:01:38.840 --> 00:01:42.640 align:middle
コレクション上に新しいインスタンスを作ります。

00:01:44.840 --> 00:01:50.200 align:middle
これらの 3 つのメソッドは
要素を 1 つ読んだり

00:01:51.240 --> 00:01:53.320 align:middle
あるところまで複数読んだりします。

00:01:54.080 --> 00:01:56.280 align:middle
これらの 2 つは

00:01:56.440 --> 00:02:00.640 align:middle
要素を 1 つか、または要素のコレクションを
ストリームに書き込みます。

00:02:00.800 --> 00:02:04.440 align:middle
ストリームから読み込み例がいくつかあります。

00:02:04.600 --> 00:02:06.600 align:middle
まず、ストリームを作ります。

00:02:06.760 --> 00:02:11.640 align:middle
コレクションから readStream を作ります。

00:02:11.800 --> 00:02:15.760 align:middle
コレクションには a から f までの
全ての文字が入っています。

00:02:15.920 --> 00:02:19.840 align:middle
コレクションの各要素として
1つずつの文字が入っています。

00:02:20.000 --> 00:02:24.520 align:middle
コレクション上のストリームを作ります。
1つ1つの文字を見ていきましょう。

00:02:25.360 --> 00:02:27.760 align:middle
ストリームの準備ができたら

00:02:28.400 --> 00:02:31.040 align:middle
最初に next メッセージを送ります。

00:02:31.200 --> 00:02:34.720 align:middle
ストリームが初期化された現在位置から

00:02:34.880 --> 00:02:36.800 align:middle
要素を返します。

00:02:36.960 --> 00:02:40.200 align:middle
ストリームの現在位置は 0 で
ストリームの先頭位置です。

00:02:40.360 --> 00:02:45.120 align:middle
next は最初の要素である a を返します。

00:02:45.920 --> 00:02:47.880 align:middle
ここで next を呼ぶと

00:02:48.040 --> 00:02:51.800 align:middle
b が得られて、そして c となります。
1つずつ。

00:02:51.960 --> 00:02:56.920 align:middle
next を呼ぶことで
現在位置が1つずつ移動します。

00:02:57.760 --> 00:03:01.440 align:middle
next を呼んで a を得てから

00:03:01.600 --> 00:03:06.480 align:middle
upTo: メッセージを送って
引数として要素を1つ渡します。

00:03:06.640 --> 00:03:10.720 align:middle
このメソッドは現在位置から
引数として渡した要素までの

00:03:10.880 --> 00:03:13.520 align:middle
全ての要素を返します。

00:03:13.680 --> 00:03:17.040 align:middle
現在位置が 1 で、a が得られた状態で

00:03:17.920 --> 00:03:19.800 align:middle
upTo: $d を送ると

00:03:19.960 --> 00:03:23.320 align:middle
現在位置から d までのものを返します。

00:03:23.480 --> 00:03:26.000 align:middle
b と c です。

00:03:26.600 --> 00:03:28.720 align:middle
d はストリームから取り出されています。

00:03:28.880 --> 00:03:32.440 align:middle
つまり、ストリームの現在位置は
d の後になっています。

00:03:32.600 --> 00:03:33.800 align:middle
d は返されていません。

00:03:34.440 --> 00:03:38.760 align:middle
stream position は現在位置を返します。

00:03:38.920 --> 00:03:40.720 align:middle
現在位置は 0 で始まります。

00:03:40.880 --> 00:03:46.400 align:middle
0 は最初の要素の前にあります。
0、1、2、3、4、と。

00:03:46.560 --> 00:03:49.120 align:middle
現在 e の前で d の後になっています。

00:03:50.760 --> 00:03:55.840 align:middle
ここで upToEnd メッセージをストリームに送ると
現在位置からストリームの末尾までの

00:03:56.000 --> 00:04:00.040 align:middle
全ての要素を得ることができます。

00:04:00.200 --> 00:04:03.400 align:middle
e と f です。

00:04:03.560 --> 00:04:07.520 align:middle
ストリームが管理している現在位置を
いくつかのメソッドを使って

00:04:07.680 --> 00:04:09.360 align:middle
進めることができます。

00:04:09.520 --> 00:04:11.680 align:middle
ストリームに書き込むこともできます。

00:04:11.840 --> 00:04:14.240 align:middle
最初に、ストリームを作ります。

00:04:15.880 --> 00:04:19.840 align:middle
Array new: 6 で
大きさ 6 の配列を作ります。

00:04:20.640 --> 00:04:24.240 align:middle
writeStream メッセージを送って
その配列上にストリームを作って

00:04:24.400 --> 00:04:27.600 align:middle
ストリームを使って配列の中身を
徐々に埋めていくことができます。

00:04:27.760 --> 00:04:30.320 align:middle
変数 stream にストリームを格納します。

00:04:30.480 --> 00:04:33.280 align:middle
最初に nextPut: 1 メッセージを送ります。

00:04:33.440 --> 00:04:38.360 align:middle
引数を 1 つ取って
ストリームの現在位置にそれを追加します。

00:04:38.520 --> 00:04:43.800 align:middle
配列には現在 1 が入っていて
空のセルが 5 個続いています。

00:04:46.280 --> 00:04:50.320 align:middle
nextPutAll: メッセージは
コレクションオブジェクトを取って

00:04:50.480 --> 00:04:53.360 align:middle
ストリームに連結します。

00:04:54.240 --> 00:04:57.800 align:middle
ストリームに nextPutAll: メッセージを送ると

00:04:58.600 --> 00:05:01.000 align:middle
配列には、前回の nextPut: の結果の

00:05:01.880 --> 00:05:04.480 align:middle
1 が入っていて

00:05:04.640 --> 00:05:06.880 align:middle
nextPutAll: の結果の

00:05:09.240 --> 00:05:11.120 align:middle
4 8 2 6 7 が続きます。

00:05:11.280 --> 00:05:14.880 align:middle
ストリームはオブジェクトのコレクションの

00:05:15.040 --> 00:05:18.560 align:middle
読み書きをする上で
特に便利で効率的です。

00:05:19.400 --> 00:05:21.600 align:middle
ファイルに読み書きをすることもできます。

00:05:21.760 --> 00:05:25.200 align:middle
例として

00:05:25.360 --> 00:05:27.440 align:middle
新規ファイルに書き込む方法を示します。

00:05:29.880 --> 00:05:32.480 align:middle
ストリームでは
ファイルの名前を入力します。

00:05:33.640 --> 00:05:39.360 align:middle
asFilereference メッセージを送ることで

00:05:39.520 --> 00:05:41.720 align:middle
ファイルへの参照を作ります。

00:05:41.880 --> 00:05:46.040 align:middle
これはまだ存在しないファイルですが
そのファイルへの参照を得ることができます。

00:05:46.640 --> 00:05:49.440 align:middle
hello.txt ファイルへの参照が得られました。

00:05:50.720 --> 00:05:52.680 align:middle
そのファイルにwriteStream メッセージを

00:05:54.120 --> 00:05:55.440 align:middle
送ることで

00:05:55.600 --> 00:06:00.760 align:middle
このまだ存在しないファイルに関連つけられた
書き込み用のストリームが得られます。

00:06:00.920 --> 00:06:05.240 align:middle
このストリームに書き込むと
すぐにファイルが作られます。

00:06:06.240 --> 00:06:11.480 align:middle
ここでストリームがあって
nextPutAll:メッセージを文字列をつけて送ります。

00:06:11.640 --> 00:06:16.720 align:middle
このメッセージは文字列の各要素を
1つずつ書き込んでいきます。

00:06:16.880 --> 00:06:19.400 align:middle
h 次に e 次に l、という具合です。

00:06:20.560 --> 00:06:21.560 align:middle
最後に

00:06:23.320 --> 00:06:24.960 align:middle
ストリームを閉じることで

00:06:25.120 --> 00:06:29.720 align:middle
ファイルへの書き込みが終わり

00:06:29.880 --> 00:06:33.360 align:middle
ストレージに全て書き出してしまって

00:06:33.520 --> 00:06:37.360 align:middle
ファイルポインタを閉じて良い
ということを OS に伝えます。

00:06:37.520 --> 00:06:42.400 align:middle
これでファイルに書き込みました。
それを読み込むことができます。

00:06:42.560 --> 00:06:46.720 align:middle
ファイル名を

00:06:46.880 --> 00:06:48.680 align:middle
文字列として示して

00:06:50.880 --> 00:06:56.200 align:middle
asFileReference で
このファイルへの参照を作ります。

00:06:57.800 --> 00:06:59.440 align:middle
readStream で

00:06:59.600 --> 00:07:02.240 align:middle
読み込みモードで開いて

00:07:02.400 --> 00:07:06.160 align:middle
読み込み用ストリームを作ります。

00:07:07.840 --> 00:07:10.680 align:middle
next で、ストリームの最初の要素を得ます。

00:07:10.840 --> 00:07:14.920 align:middle
「Hello Pharo!」と書き込んだので
最初の要素は H です。

00:07:15.600 --> 00:07:19.000 align:middle
現在位置は H の後で e の前ですが

00:07:19.160 --> 00:07:22.400 align:middle
upToEnd でその現在位置から

00:07:22.560 --> 00:07:25.840 align:middle
ファイルの終わりまでの要素を得ます。

00:07:26.000 --> 00:07:28.800 align:middle
H 抜きの 「ello Pharo!」が得られます。

00:07:28.960 --> 00:07:33.160 align:middle
H は next で既に取り出しているので。

00:07:33.320 --> 00:07:36.960 align:middle
ストリームを使って
コレクションを作ることができます。

00:07:37.120 --> 00:07:39.880 align:middle
コレクションを作って

00:07:40.040 --> 00:07:44.320 align:middle
中に何がはいるべきかを
徐々に選んでいきたい時に便利です。

00:07:45.480 --> 00:07:48.680 align:middle
OrderedCollection を

00:07:50.840 --> 00:07:53.160 align:middle
ストリームにメッセージを送ることで
作ります。

00:07:53.320 --> 00:07:56.240 align:middle
OrderedCollection の

00:07:56.960 --> 00:07:58.640 align:middle
新しいインスタンスから始めて

00:07:59.240 --> 00:08:01.760 align:middle
writeStream にします。

00:08:02.520 --> 00:08:06.280 align:middle
nextPut: メッセージで
ストリームに 1 を加えます。

00:08:06.440 --> 00:08:10.200 align:middle
stream contents で

00:08:10.360 --> 00:08:13.440 align:middle
値 1 だけが格納された

00:08:13.600 --> 00:08:15.520 align:middle
OrderedCollection クラスの
インスタンスが得られます。

00:08:16.240 --> 00:08:19.720 align:middle
これら3つの式は下に示したように
簡略化できます。

00:08:20.720 --> 00:08:23.240 align:middle
streamContents: メッセージを

00:08:23.400 --> 00:08:26.960 align:middle
欲しいコレクションのクラスである
OrderedCollection に送ります。

00:08:27.120 --> 00:08:29.960 align:middle
OrderedCollection に
streamContents: を送り

00:08:30.120 --> 00:08:35.000 align:middle
引数としてブロックを渡します。
ブロックは引数としてストリームを受け取ります。

00:08:35.160 --> 00:08:39.160 align:middle
ブロックでは、コレクションの中身を
ストリームを使って徐々に埋めていきます。

00:08:39.320 --> 00:08:41.760 align:middle
ブロックが終わったら
コレクションが得られます。

00:08:42.320 --> 00:08:46.120 align:middle
ブロックでは、stream nextPut: 1 としています。

00:08:46.880 --> 00:08:49.720 align:middle
ストリームに 1 を加えます。

00:08:49.880 --> 00:08:51.880 align:middle
1 がコレクションに追加されます。

00:08:52.040 --> 00:08:55.880 align:middle
この表現式が終わると
streamContents: が終了します。

00:08:56.040 --> 00:08:58.840 align:middle
1 を格納した
OrderedCollection が得られます。

00:08:59.000 --> 00:09:03.720 align:middle
streamContents: はコレクションを
真っ新な状態から作るときに便利です。

00:09:04.400 --> 00:09:07.600 align:middle
このコースでは
ストリームの API を学びました。

00:09:07.760 --> 00:09:11.920 align:middle
Nautilus コードナビゲーターで
クラスを探索して

00:09:12.080 --> 00:09:14.280 align:middle
学ぶべきメソッドが沢山あります。

00:09:14.440 --> 00:09:18.560 align:middle
ストリームでメモリ上のコレクションや
ファイルやネットワークなどを

00:09:18.720 --> 00:09:22.480 align:middle
読んだり書いたりすることができます。

00:09:23.640 --> 00:09:26.160 align:middle
ストリームは現在位置を管理します。

00:09:27.040 --> 00:09:31.440 align:middle
現在位置は
過去の要素と未来の要素の区切りです。

00:09:31.600 --> 00:09:36.000 align:middle
ストリームを読み書きする度に
現在位置が変化します。

00:09:37.200 --> 00:09:40.480 align:middle
ストリームは新しいコレクションを作る
のにも役に立ちます。

