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


関連記事

【Java】Handlerクラスについてまとめてみました

1 はじめに2 Handlerクラスを使う理由3 Handlerクラスの基本4 Handlerを使ってsetText()を実行してみる5 sendMessage()を実行してみる6 さいごに7 おすす ...

[Android] KotlinでTextToSpeech

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

Androidでのローカルプッシュ通知実装

1 はじめに2 WorkManagerとは?3 WorkManagerの導入4 実装例4.1 Workerの実装4.2 OneTimeWorkRequestBuilderの実装4.3 Periodic ...

Flutterでテストコードを書こう! 単体テスト・Widgetテスト・インテグレーションテスト

1 はじめに2 単体テスト2.1 testパッケージの利用2.2 テストの書き方2.3 テストの実行2.4 モック化2.4.1 mockitoの導入2.4.2 メソッドのモック化3 Widgetテスト ...

[Kotlin]DatePickerDialogとTimePickerDialogを使って見た。

1 はじめに2 Anko Commons3 DatePickerDialog3.1 DatePickerFlagment3.2 呼び出し方4 TimePickerDialog4.1 TimePicke ...

フォロー

blog-page_side_responsive

2020年1月
 1234
567891011
12131415161718
19202122232425
262728293031  

アプリ情報

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