検索

キーワード


【Java】入出力ストリーム(java.ioパッケージ)

  • 公開日:2020-11-30 23:57:34
  • 最終更新日:2020-12-01 00:25:27
【Java】入出力ストリーム(java.ioパッケージ)

当記事では、java.ioパッケージを使った入出力ストリームについて解説します。

Javaの初学者にとっては、入出力ストリームやバイナリデータ、バッファなどといった慣れない単語が出てきたり、様々なクラスが出てきてつまづく人も多い箇所です。著者も最初に学習した際は、仕組みがよくわからないまま使ってしまっていました。

なので、当記事では、これらの概念についてJava Gold SE 11の資格を持つ著者がなるべく丁寧に説明していきたいと思います。

具体的にファイル入出力の方法について知りたい方は、以下の記事を参照して下さい。

【Java】バイナリファイルの入出力

【Java】テキストファイルの入出力

また、Javaにおけるファイルの基本操作については、以下の関連記事を参照してください。

【Java】java.io.Fileクラスの使い方(ファイル・ディレクトリ操作、パス、ファイル名、拡張子)

【Java】java.io.Fileクラスの使い方(ファイル一覧の取得、フィルタ)


入出力ストリームとは?

 「入出力ストリーム(stream:「流れ」という意味)」とは、ファイルなどからデータを読み取ったり書き込んだりする際のデータの流れのことです。java.ioパッケージでは、下図のような大元になる4つの抽象クラス(InputStream, OutputStream, Reader, Writer)が用意されています。入出力ストリームの説明

バイナリ(binary)とは、2進数という意味で、バイナリデータとは2進数で記述されるデータの総称です。バイナリデータを扱うストリームのことをバイトストリームといい、InputStreamクラスとOutputStreamクラスがこれに該当します。

テキストデータもコンピュータ上のデータなので、バイナリデータと同じく2進法で記述されていますが、こちらは「文字コード」という枠組みに従って文字を記述したものになります。テキストデータを扱うストリームのことを文字ストリームといい、ReaderクラスとWriterクラスがこれに該当します。

文字コードについては、以下の記事を参照してください。

【Java】文字コードの変換・判定

java.ioパッケージで用意されているファイル入出力のための様々なクラスは、ほとんどがInputStream, OutputStream, Reader, Writerの4つの抽象クラスのうちいずれかを継承し、データの種類や用途に合わせて機能を追加した具象クラスになります。


バッファとは?

Javaにおける入出力ストリームを扱うクラスの一部(BufferedReaderなど)では、バッファを利用してファイル入出力の高速化を行っています。

バッファ(Buffer)とは、一時的にデータを蓄えておく記憶領域のことです。Javaにおいて、バッファを利用しないファイル入出力を行う際は、1バイトずつ読み込んではJavaアプリケーション上で処理を行うということを繰り返していますが、読み取り要求や書き込み要求は比較的負荷の高い処理であるため、効率が下がる恐れがあります。

そこで、Javaのバッファを用いた入出力ストリームでは、バッファがいっぱいになるまでデータを蓄積し、その後蓄積されたデータをまとめて処理を行うことで読み書きを効率化します。

この仕組みは、人が文章を書き写すときに、1文字ずつ書き写すのではなく、ある程度単語や文章を記憶して書き写すのと似ています。


バイトストリーム

バイトストリーム(Byte stream)とは、バイナリデータの入出力を扱うストリームです。java.ioでは、InputStreamを継承したクラスがバイトストリームの入力を扱い、OutputStreamを継承したクラスがバイトストリームの出力を扱います。

バイトストリームはプリミティブ型などの単純なデータや、文字で表せない画像や音声ファイルなどの入出力を扱うときに用いるのが良く、文字データの入出力を扱う際は文字ストリームを用いたほうが良いことが多いです。

バイトストリームを使った具体的なバイナリファイル入出力の方法は、以下の記事を参照してください。

【Java】バイナリファイルの入出力


InputStreamを継承したクラス

ここではInputStreamを継承した主要なクラスについての簡単な説明を行います。


FileInputStream

ファイルからバイナリデータを1バイトずつ読み取るための入力ストリームを作成します。


BufferedInputStream

バッファを利用して、FileInputStreamより高速にバイナリデータを読み取ることが出来ます。


DataInputStream

バイトストリームからint型やboolean型といったプリミティブ型のJavaデータを読み取ります。


OutputStreamを継承したクラス

ここではOutputStreamを継承した主要なクラスについての簡単な説明を行います。


FileOutputStream

ファイルに1バイトずつバイナリデータを書き込むための出力ストリームを作成します。


BufferedOutputStream

バッファを利用して、FileOutputStreamより高速にバイナリデータを書き込むことが出来ます。


DataOutputStream

バイトストリームからint型やboolean型といったプリミティブ型のJavaデータをバイナリデータとしてファイルに書き込みます。


文字ストリーム

文字ストリーム(Character stream)とは、テキストデータの入出力を扱うストリームです。java.ioでは、Readerを継承したクラスが文字ストリームの入力を扱い、Writerを継承したクラスが文字ストリームの出力を扱います。

文字ストリームを使った具体的なバイナリファイル入出力の方法は、以下の記事を参照してください。

【Java】テキストファイルの入出力


Readerを継承したクラス

ここではReaderを継承した主要なクラスについての簡単な説明を行います。


FileReader

ファイルから1文字ずつ読み取るための文字ストリームを作成します。


BufferedReader

バッファを利用して、FileReaderより高速にデータを読み取ることが出来ます。


OutputStreamWriter

バイトストリームを文字ストリームに変換するのクラスで、文字コードを変換してテキストファイルを読み込むときなどに使われます。


Writerを継承したクラス

ここではWriterを継承した主要なクラスについての簡単な説明を行います。


FileWriter

ファイルにテキストデータを1文字ずつ書き込むための文字ストリームを作成します。


BufferedWriter

バッファを利用して、FileWriterより高速にテキストデータを書き込むことが出来ます。


OutputStreamWriter

バイトストリームを文字ストリームに変換するのクラスで、文字コードを変換してテキストファイルを出力するときなどに使われます。


PrintWriter

テキストの標準出力(コンソールへの出力)ストリームを扱います。OutputStreamを継承したPrintStreamでも標準出力ストリームを扱いますが、機能的には同様なので、一般的にはこちらを用いることが多いです。


まとめ

今回はJavaにおける入出力ストリームの概念と、Javaでファイル入出力ストリームを扱う際によく使われる用語について説明しました。ストリームという大元の概念を理解しておけば、Javaにおけるファイル入出力についての理解が簡単になると思います。

Javaにおける入出力ストリームの具体的な使い方については、以下の関連記事で扱っています。

関連記事:

【Java】バイナリファイルの入出力

【Java】テキストファイルの入出力

【Java】文字コードの変換

【Java】java.io.Fileクラスの使い方(ファイル・ディレクトリ操作、パス、ファイル名、拡張子)

【Java】java.io.Fileクラスの使い方(ファイル一覧の取得、フィルタ)



【著者】

ゆうさい

フォワードソフト株式会社のエンジニア。経験はまだ浅いものの、Java、Python、JavaScriptなど様々な言語の他、クラウドやネットワーク技術を勉強しています。PythonやVBAを使った自動化で楽をするのを考えるのが好きです。 Oracle Certified Java Programmer Gold SE 11、HTML5プロフェッショナル認定試験レベル2、AWSプラクティショナーなどの情報資格を保有しています。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様