Java OutputStreamガイド

Java OutputStreamのガイド

 

1. 概要

このチュートリアルでは、JavaクラスOutputStreamの詳細について説明します。 OutputStreamは抽象クラスです。 これはthe superclass for all classes representing an output stream of bytes.として機能します

「出力」や「ストリーム」などのこれらの単語が何を意味するのかを詳しく見ていきます。

2. Java IOの簡単な紹介

JavaでI / O操作を実行するために必要なクラスを定義するOutputStream is part of the Java IO API。 これらはすべてjava.io名前空間にパッケージ化されています。 これは、バージョン1.0以降のJavaで利用可能なコアパッケージの1つです。

Java 1.4以降、名前空間java.nioにJava NIOがパッケージ化されており、非ブロッキングの入出力操作が可能になります。 ただし、この記事の重点分野は、Java IOの一部としてのObjectStreamです。

JavaIOおよびJavaNIOに関連する詳細は、hereにあります。

2.1. 入出力

Java IOは基本的にa mechanism to read data from a source and write data to a destinationを提供します。 ここで、入力は「ソース」を表し、出力は「宛先」を表します。

これらのソースと宛先は、ファイル、パイプからネットワーク接続まで何でもかまいません。

2.2. ストリーム

Java IOは、streams which basically represents a continuous flow of dataの概念を提供します。 ストリームは、バイト、文字、オブジェクトなど、さまざまな種類のデータをサポートできます。

さらに、ソースまたは宛先への接続は、ストリームが表すものです。 したがって、それらはそれぞれInputStreamまたはOutputStreamとして提供されます。

3. OutputStreamのインターフェース

OutputStreamは、サブクラスにいくつかの異なる文字を提供する一連のインターフェースを実装します。 それらを簡単に見ていきましょう。

3.1. Closeable

インターフェイスCloseableは、close() と呼ばれるメソッドを提供します。handles closing a source or a destination of data.OutputStreamのすべての実装は、このメソッドの実装を提供する必要があります。 ここで、リソースを解放するアクションを実行できます。

3.2. AutoCloseable

インターフェイスAutoCloseableは、Closeableのメソッドと同様の動作をするclose()と呼ばれるメソッドも提供します。 ただし、この場合、method close() is automatically called when exiting a try-with-resource block.

try-with-resourceの詳細については、hereをご覧ください。

3.3. Flushable

インターフェイスFlushableは、宛先へのデータのフラッシュを処理するflush()と呼ばれるメソッドを提供します。

OutputStreamの特定の実装では、以前に書き込まれたバイトをバッファリングして最適化することを選択できますが、a call to flush() makes it write to the destination immediatelyです。

4. OutputStreamのメソッド

OutputStreamにはいくつかのメソッドがあり、各実装クラスはそれぞれのデータ型に対して実装する必要があります。

これらは、CloseableおよびFlushableインターフェースから継承するclose()およびflush()メソッドとは別のものです。

4.1. write(int b)

このメソッドをwrite one specific byte to the OutputStreamに使用できます。 引数「int」は4バイトで構成されているため、契約と同様に最初の下位バイトのみが書き込まれ、残りの上位3バイトは無視されて無視されます。

public static void fileOutputStreamByteSingle(String file, String data) throws IOException {
    byte[] bytes = data.getBytes();
    try (OutputStream out = new FileOutputStream(file)) {
        out.write(bytes[6]);
    }
}

データを「Hello World!」としてこのメ​​ソッドを呼び出すと、結果として得られるのは、次のテキストを含むファイルです。

W

ご覧のとおり、これは6番目にインデックス付けされた文字列の7番目の文字です。

4.2. write(byte[] b, int off, int length)

write()メソッドのこのオーバーロードされたバージョンは、write a sub-sequence of the byte array to the OutputStreamにあります。

「off」で決定されたオフセットで始まる引数で指定された「長さ」のバイト数をOutputStream:に書き込むことができます。

public static void fileOutputStreamByteSubSequence(
  String file, String data) throws IOException {
    byte[] bytes = data.getBytes();
    try (OutputStream out = new FileOutputStream(file)) {
        out.write(bytes, 6, 5);
    }
}

以前と同じデータでこのメソッドを呼び出すと、出力ファイルに次のテキストが表示されます。

World

これは、インデックス5から始まり、5文字で構成されるデータのサブストリングです。

4.3. write(byte[] b)

これは、OutputStreamへの引数で指定されたwrite an entire byte arrayが可能なwrite()メソッドのさらに別のオーバーロードバージョンです。

これは、write(b, 0, b.lengh)の呼び出しと同じ効果があります。

public static void fileOutputStreamByteSequence(String file, String data) throws IOException {
    byte[] bytes = data.getBytes();
    try (OutputStream out = new FileOutputStream(file)) {
        out.write(bytes);
    }
}

同じデータを使用してこのメ​​ソッドを呼び出すと、出力ファイルにString全体が含まれます。

Hello World!

5. OutputStreamの直接サブクラス

次に、OutputStreamが定義する特定のデータ型を個別に表す、OutputStreamの直接既知のサブクラスのいくつかについて説明します。

それらは、OutputStreamから継承されたものを実装することとは別に、独自のメソッドを定義します。

これらのサブクラスの詳細については説明しません。

5.1. FileOutputStream

名前が示すように、FileOutputStreaman OutputStream to write data to a Fileです。 FileOutputStreamは、他のOutputStreamと同様に、生のバイトのストリームを書き込むことができます。

前のセクションの一部として、FileOutputStreamでさまざまなメソッドをすでに検討しました。

5.2. ByteArrayOutputStream

ByteArrayOutputStreamimplementation of OutputStream that can write data into a byte arrayです。 ByteArrayOutputStreamがバッファにデータを書き込むと、バッファは大きくなり続けます。

バッファーのデフォルトの初期サイズを32バイトのままにするか、使用可能なコンストラクターのいずれかを使用して特定のサイズを設定できます。

ここで注意すべき重要な点は、メソッドclose()は実質的に効果がないということです。 ByteArrayOutputStreamの他のメソッドは、close()が呼び出された後でも安全に呼び出すことができます。

5.3. FilterOutputStream

OutputStreamは主に宛先にバイトストリームを書き込みますが、データを変換する前に変換することもできます。 FilterOutputStreamsuperclass of all such classes which perform a specific data transformationを表します。 FilterOutputStreamは、常に既存のOutputStreamで構成されます。

FilterOutputStreamの例には、BufferedOutputStreamCheckedOutputStreamCipherOutputStreamDataOutputStreamDeflaterOutputStreamDigestOutputStreamInflaterOutputStreamがあります。 )s、PrintStream

5.4. ObjectOutputStream

ObjectOutputStreamは宛先にwrite primitive data types and graphs of Java objectsできます。 既存のOutputStreamを使用してObjectOutputStreamを構築し、Fileなどの特定の宛先に書き込むことができます。

オブジェクトが宛先に書き込むには、オブジェクトがObjectOutputStreamに対してSerializableを実装する必要があることに注意してください。 Javaシリアル化hereの詳細については、こちらをご覧ください。

5.5. PipedOutputStream

PipedOutputStreamuseful to create a communication pipeです。 PipedOutputStreamは、接続されたPipedInputStreamが読み取ることができるデータを書き込むことができます。

PipedOutputStreamは、PipedInputStreamに接続するコンストラクターを備えています。 または、connect()と呼ばれるPipedOutputStreamで提供されるメソッドを使用して、後でこれを行うこともできます。

6. OutputStreamバッファリング

通常、入出力操作には、ディスクアクセス、ネットワークアクティビティなどの比較的高価な操作が含まれます。 これを頻繁に実行すると、プログラムの効率が低下する可能性があります。

これらのシナリオを処理するために、Javaのデータの「バッファードストリーム」があります。 BufferedOutputStreamwrites data to a buffer instead which is flushed to the destination less often、バッファがいっぱいになったとき、またはメソッドflush()が呼び出されたとき。

BufferedOutputStreamは、前述のFilterOutputStreamを拡張し、既存のOutputStream をラップして宛先に書き込みます。

public static void bufferedOutputStream(
  String file, String ...data) throws IOException {

    try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file))) {
        for(String s : data) {
            out.write(s.getBytes());
            out.write(" ".getBytes());
        }
    }
}

注意すべき重要な点は、各データ引数のwrite()へのすべての呼び出しはバッファに書き込むだけであり、ファイルへの潜在的に高価な呼び出しにはならないということです。

上記の場合、データを「Hello」、「World!」としてこのメ​​ソッドを呼び出すと、メソッド%を呼び出すtry-with-resourcesブロックからコードが終了したときにのみ、データがファイルに書き込まれます。 BufferedOutputStreamの(t0)s。

これにより、次のテキストを含む出力ファイルが作成されます。

Hello World!

7. OutputStreamWriterでテキストを書く

前に説明したように、バイトストリームは、テキスト文字の束である生データを表します。 これで、文字配列を取得して、バイト配列への変換を自分で実行できます。

byte[] bytes = data.getBytes();

Javaは、このギャップを埋める便利なクラスを提供します。 OutputStreamの場合、このクラスはOutputStreamWriterです。 OutputStreamWriter wraps an OutputStream and can directly write characters to the desired destination

オプションで、OutputStreamWriter にエンコード用の文字セットを提供することもできます。

public static void outputStreamWriter(String file, String data) throws IOException {
    try (OutputStream out = new FileOutputStream(file);
        Writer writer = new OutputStreamWriter(out,"UTF-8")) {
        writer.write(data);
    }
}

ご覧のとおり、FileOutputStream.を使用する前に文字配列からバイト配列への変換を実行する必要はありません。OutputStreamWriterはこれを便利に実行します.

「Hello World!」などのデータを使用して上記のメソッドを呼び出すと、当然のことながら、次のようなテキストを含むファイルになります。

Hello World!

8. 結論

この記事では、Java抽象クラスOutputStreamについて説明しました。 私たちはそれが実装するインターフェースとそれが提供するメソッドを試しました。

次に、Javaで使用可能なOutputStreamのサブクラスのいくつかについて説明しました。 最後に、バッファリングと文字ストリームについて話しました。

いつものように、例のコードはover on GitHubで利用できます。