Android

【Java】ストリームについてまとめてみました

投稿日:

はじめに

Javaではすべての入出力をストリームと呼ばれる仕組みをつかって実装します。データを細い流れに見立て順番に吸い上げたり、送り出したりすることからそのように呼ばれています。ストリームを利用することで、入出力の媒体に依存することなく同じ要領で操作することができます。

Streamの分類

ストリームは、特定の媒体からデータを読み込むための入力ストリーム(InputStream)と、データを順番に媒体に書き出すための出力ストリーム(OutputStream)に分類できます。java.io パッケージでは、これらの抽象基底クラスをもとにファイルやバッファ、配列などを操作する様々な実装クラスを提供しています。

テキストファイルの読み書き

ストリーム実装クラスのFileReader/FileWriterクラスを使ってテキストファイルの読み書きをプログラム上で行ってみましょう。
FileReader/FileWriterクラスはテキストファイルを読み書きするための入出力ストリームを提供します。

文字列を読み込むのはreadメソッドの役割です。readメソッドはファイルから次の1文字を読み込み、その文字をint型で表したものを返すメソッドです。ストリームの終わりに達した場合は -1 を返します。この性質を利用してreadメソッドが -1 をかえすまでwhileループを回し、ファイルの内容を読み込みます。読み込んだ内容は、FileWriterクラスのwriteメソッドでファイルに転記します。
ストリームによる処理は必ずtryブロックでくくり、クローズ処理はfinallyブロックで表すのが基本です。正しくクローズされなかったリソースはメモリを圧迫する原因となるので必ずクローズを行いましょう。

バイナリファイルの読み書き

FileInputStream/FileOutputStreamクラスを利用して、画像などのバイナリファイルを読み書きするための入出力ストリームを使用できます。

上記はinput.gifの内容をFileInputStreamで読み込み、その結果をFileOutputStreamでoutput.gifに出力するサンプルです。
コンストラクター、read/write メソッドの構文はFileReader/FileWriterクラスと同様です。

読み書きのバッファリング処理

ファイルやネットワークに対する読み書きは、メモリに対するものと比べると、速度が格段に遅くなりがちです。そうした速度の遅くなる媒体に対して、1文字、1バイト単位でのアクセスは効率が良くありません。バッファリング処理を使うことでこの問題を解決しましょう。バッファーとは、文字列などのデータを一時的に保存するためのメモリ上の領域のことをいいます。バッファリングを利用すると、データをバッファー領域に蓄積し、いっぱいになったところでまとめてファイルを出力したり、読み込んだりします。

バッファリング処理を行うには、BufferedReader/BufferedWriterコンストラクターでInputStreamReader/OutputStreamWriterを受け取るだけです。
flushメソッドで、バッファ内容を出力ストリームに出力します。バッファリング処理を利用している時は、writeメソッドの呼び出しによって即座に出力が開始されるかどうかはわかりません。
ネットワーク通信などで、出力のタイミングを厳密に制御する必要がある場合は、flushメソッドを明示的に呼び出す必要があります。

さいごに

今回は、Javaのストリームについてまとめてみました。通信を伴った実装を行う時には必須のクラスであるので、基本的な部分をまとめることにしました。

おすすめ書籍

AndroidエンジニアのためのモダンJava スッキリわかるJava入門 第3版 (スッキリシリーズ) スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)

blog-page_footer_336




blog-page_footer_336




-Android
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

KotlinでAndroidの双方向DataBindingを利用する

1 はじめに2 MVVMアーキテクチャ2.1 Model2.2 View2.3 ViewModel3 KotlinでAndroid DataBindingを設定4 説明用のサンプルアプリについて5 a ...

[Androidアニメーション]Shared Elements遷移

1 はじめに2 Shared Elements遷移とは3 layout xml4 Activity遷移5 その他6 さいごに はじめに 最近、雨が多いですね。そんな時は家にこもって、プログラミングをす ...

Flutter開発のはじめかた 開発環境セットアップ〜Widtgetの解説

1 はじめに2 セットアップ2.1 Flutterのインストール2.1.1 Android環境のセットアップ2.1.2 Xcodeのインストール2.1.3 IDEのセットアップ(Android Stu ...

[Android] KotlinでTextToSpeech

1 はじめに2 環境3 MainActivity.kt4 SpeechListener.kt5 activity_main.xml6 さいごに はじめに こんにちは。最近ようやくKotlinに手を付け ...

[Android] リソースフォルダの修飾子

1 はじめに2 画面の向き3 画面サイズ4 テキスト入力方法5 複数修飾子の組み合わせ6 その他7 さいごに はじめに Androidアプリではリソースフォルダ名に修飾子をつけることによって、様々な環 ...

フォロー

blog-page_side_responsive

2020年1月
 1234
567891011
12131415161718
19202122232425
262728293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。