InputStream&Output Streamとは何ですか?なぜ、いつ使用するのですか?


290

誰かが私に何InputStreamを説明してOutputStreamいるか?

私は両方のためのユースケースについて混乱していますInputStreamOutputStream

コードスニペットを含めて説明に添えるとしたら、それはすばらしいことです。ありがとう!

回答:


218

の目的はInputStreamOutputStream入出力のさまざまな方法を抽象化することです。ストリームがファイルであるか、Webページであるか、画面であるかは関係ありません。重要なのは、ストリームから情報を受け取る(またはそのストリームに情報を送る)ことだけです。

InputStream は、あなたが読んだ多くのことに使用されます。

OutputStream はあなたが書く多くのことに使われます。

これがサンプルコードです。を想定してInputStream instrおりOutputStream osstr、すでに作成されています。

int i;

while ((i = instr.read()) != -1) {
    osstr.write(i);
}

instr.close();
osstr.close();

67
「ストリーム」とは何ですか?
Koray Tugay 14年

55
@KorayTugayストリームは通常、文字のセットとして定義されます。より正確には、複数のビットまたは文字がストリームとして呼び出されます。
Gowtham Gopalakrishnan 2014

14
複数の文字も文字列です。ストリームと文字列の違いは何ですか?
Prajeet Shrestha

ストリームはゼロと1であり、文字ではないと思います。
smilyface

93

InputStreamは読み取りに、OutputStreamは書き込みに使用されます。これらは互いにデコレータとして接続されているため、さまざまなタイプのソースからすべてのタイプのデータを読み書きできます。

たとえば、プリミティブデータをファイルに書き込むことができます。

File file = new File("C:/text.bin");
file.createNewFile();
DataOutputStream stream = new DataOutputStream(new FileOutputStream(file));
stream.writeBoolean(true);
stream.writeInt(1234);
stream.close();

書かれた内容を読むには:

File file = new File("C:/text.bin");
DataInputStream stream = new DataInputStream(new FileInputStream(file));
boolean isTrue = stream.readBoolean();
int value = stream.readInt();
stream.close();
System.out.printlin(isTrue + " " + value);

他のタイプのストリームを使用して、読み取り/書き込みを強化できます。たとえば、効率を上げるためにバッファを導入できます。

DataInputStream stream = new DataInputStream(
    new BufferedInputStream(new FileInputStream(file)));

オブジェクトなどの他のデータを書き込むことができます。

MyClass myObject = new MyClass(); // MyClass have to implement Serializable
ObjectOutputStream stream = new ObjectOutputStream(
    new FileOutputStream("C:/text.obj"));
stream.writeObject(myObject);
stream.close();

他のさまざまな入力ソースから読み取ることができます。

byte[] test = new byte[] {0, 0, 1, 0, 0, 0, 1, 1, 8, 9};
DataInputStream stream = new DataInputStream(new ByteArrayInputStream(test));
int value0 = stream.readInt();
int value1 = stream.readInt();
byte value2 = stream.readByte();
byte value3 = stream.readByte();
stream.close();
System.out.println(value0 + " " + value1 + " " + value2 + " " + value3);

ほとんどの入力ストリームには、出力ストリームもあります。特別なものを読み書きするための独自のストリームを定義でき、複雑なものを読み込むための複雑なストリームがあります(たとえば、ZIP形式を読み書きするためのストリームがあります)。


35

Javaチュートリアルから:

ストリームは一連のデータです。

プログラムは、入力ストリームを使用して、一度に1項目ずつソースからデータを読み取ります。

ここに画像の説明を入力してください

プログラムは、出力ストリームを使用して、一度に1アイテムずつ宛先にデータを書き込みます。

ここに画像の説明を入力してください

上記のデータソースとデータ宛先は、データを保持、生成、または消費するものであれば何でもかまいません。明らかにこれにはディスクファイルが含まれますが、ソースまたは宛先は別のプログラム、周辺機器、ネットワークソケット、またはアレイにすることもできます

Oracleチュートリアルのサンプルコード

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyBytes {
    public static void main(String[] args) throws IOException {

        FileInputStream in = null;
        FileOutputStream out = null;

        try {
            in = new FileInputStream("xanadu.txt");
            out = new FileOutputStream("outagain.txt");
            int c;

            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

このプログラムは、バイトストリームを使用して、一度に1バイトずつ書き込むことによりxanadu.txtファイルをoutagain.txtにコピーします。

バイトストリームのラッパーである高度な文字ストリームの詳細については、このSEの質問をご覧ください。

バイトストリームと文字ストリーム


9

InputStreamから読み取り、OutputStreamに書き込みます。

たとえば、ファイルをコピーするとします。ソースファイルから読み取るFileInputStreamと、新しいファイルに書き込むFileOutputStreamを作成します。

データが文字ストリームの場合、必要に応じて、InputStreamの代わりにFileReaderを使用し、OutputStreamの代わりにFileWriterを使用できます。

InputStream input = ... // many different types
OutputStream output = ... // many different types

byte[] buffer = new byte[1024];
int n = 0;
while ((n = input.read(buffer)) != -1)
    output.write(buffer, 0, n);

input.close();
output.close();

3
close常にflushesなので、いいえ。
pstanton 2012

5

OutputStreamは、出力の書き込みを表す抽象クラスです。多くの異なるOutputStreamクラスがあり、それらは特定のもの(画面、ファイル、バイト配列、ネットワーク接続など)に書き出します。InputStreamクラスは同じものにアクセスしますが、それらからデータを読み取ります。

ここで良い基本的な例後ろにそれを読んで、その後、ファイルにデータを書き込むためのFileOutputStreamとのFileInputStreamを使用します。


4

ストリームは、液体、空気、またはガスの連続的な流れです。

Javaストリームは、ソースから宛先へのデータの流れです。ソースまたは宛先は、ディスク、メモリ、ソケット、またはその他のプログラムです。データは、バイト、文字、またはオブジェクトです。同じことがC#またはC ++ストリームにも当てはまります。Javaストリームの優れたメタファーは、蛇口から浴槽に流れ込み、後で排水路に流れる水です。

データはストリームの静的な部分を表します。読み取りおよび書き込みメソッドは、ストリームの動的部分です。

InputStreamソースからのデータのフローをOutputStream表し、は宛先へのデータのフローを表します。最後に、InputStreamそしてOutputStreamそのようなCファイルポインタとしてデータへの低レベルのアクセスを抽象化しています。


2

ストリーム:簡単に言うと、ストリームはデータであり、最も一般的なストリームはデータのバイナリ表現です。

入力ストリーム:ファイルまたはその他のソースからデータを読み取る場合、使用されるストリームは入力ストリームです。簡単に言えば、入力ストリームはデータを読み取るチャネルとして機能します。

出力ストリーム:ソース(ファイルなど)からデータを読み取って処理する場合は、最初にデータを保存する必要があります。データを保存する手段は、出力ストリームです。


0

出力ストリームは一般に、ファイルやネットワークなどの一部のデータ宛先に関連しています。Java出力ストリームでは、最終的にデータが書き込まれ、終了する宛先です

import java.io.printstream;

class PPrint {
    static PPrintStream oout = new PPrintStream();
}

class PPrintStream {
    void print(String str) { 
        System.out.println(str)
    }
}

class outputstreamDemo {
    public static void main(String args[]) {
        System.out.println("hello world");
        System.out.prinln("this is output stream demo");
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.