Apa itu InputStream & Output Stream? Mengapa dan kapan kita menggunakannya?

290

Seseorang menjelaskan kepada saya apa InputStreamdan apa OutputStream?

Saya bingung tentang kasus penggunaan untuk keduanya InputStreamdan OutputStream.

Jika Anda juga bisa memasukkan potongan kode untuk mengikuti penjelasan Anda, itu akan bagus. Terima kasih!

Orang Bohemian
sumber

Jawaban:

218

Tujuan dari InputStreamdan OutputStreamuntuk mengabstraksikan berbagai cara input dan output: apakah streaming adalah file, halaman web, atau layar tidak masalah. Yang penting adalah Anda menerima informasi dari arus (atau mengirim informasi ke aliran itu.)

InputStream digunakan untuk banyak hal yang Anda baca.

OutputStream digunakan untuk banyak hal yang Anda tulis.

Ini beberapa contoh kode. Ini mengasumsikan InputStream instrdan OutputStream osstrtelah dibuat:

int i;

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

instr.close();
osstr.close();
Chip Uni
sumber
67
Apa itu "Stream"?
Koray Tugay
55
@ KorayTugay Aliran umumnya didefinisikan sebagai sekumpulan karakter. Untuk lebih tepatnya, lebih dari satu bit atau karakter disebut stream.
Gowtham Gopalakrishnan
14
Lebih dari satu karakter adalah String juga. Apa yang membedakan aliran dari string?
Prajeet Shrestha
Saya pikir streaming hanya nol dan yang., Bukan karakter.
smilyface
93

InputStream digunakan untuk membaca, OutputStream untuk menulis. Mereka terhubung sebagai dekorator satu sama lain sehingga Anda dapat membaca / menulis semua jenis data yang berbeda dari semua jenis sumber yang berbeda.

Misalnya, Anda dapat menulis data primitif ke file:

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

Untuk membaca konten tertulis:

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);

Anda dapat menggunakan jenis aliran lainnya untuk meningkatkan kemampuan membaca / menulis. Misalnya, Anda dapat memperkenalkan buffer untuk efisiensi:

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

Anda dapat menulis data lain seperti objek:

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

Anda dapat membaca dari sumber input lain yang berbeda:

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);

Untuk sebagian besar input stream ada juga aliran output. Anda dapat menentukan aliran Anda sendiri untuk membaca / menulis hal-hal khusus dan ada aliran kompleks untuk membaca hal-hal kompleks (misalnya ada Aliran untuk membaca / menulis format ZIP).

Arne Deutsch
sumber
35

Dari Tutorial Java :

Aliran adalah urutan data.

Suatu program menggunakan aliran input untuk membaca data dari sumber, satu per satu:

masukkan deskripsi gambar di sini

Suatu program menggunakan aliran output untuk menulis data ke suatu tujuan, satu per satu waktu:

masukkan deskripsi gambar di sini

Sumber data dan tujuan data yang digambarkan di atas dapat berupa apa saja yang menampung, menghasilkan, atau menggunakan data. Jelas ini termasuk file disk , tetapi sumber atau tujuan juga dapat berupa program lain, perangkat periferal, soket jaringan, atau array .

Kode contoh dari tutorial 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();
            }
        }
    }
}

Program menggunakan byte ini stream untuk menyalin xanadu.txt file outagain.txt , dengan menulis satu byte pada suatu waktu

Lihatlah pertanyaan SE ini untuk mengetahui detail lebih lanjut tentang stream Karakter lanjutan, yang merupakan pembungkus di atas Byte Streams:

aliran byte dan aliran karakter

Ravindra babu
sumber
9

Anda membaca dari InputStream dan menulis ke OutputStream.

misalnya, katakan Anda ingin menyalin file. Anda akan membuat FileInputStream untuk dibaca dari file sumber dan FileOutputStream untuk menulis ke file baru.

Jika data Anda adalah aliran karakter, Anda bisa menggunakan FileReader alih-alih InputStream dan FileWriter alih-alih OutputStream jika Anda mau.

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();
pstanton
sumber
3
closeselalu flushes, jadi tidak.
pstanton
5

OutputStream adalah kelas abstrak yang mewakili penulisan output. Ada banyak kelas OutputStream yang berbeda, dan mereka menulis hal-hal tertentu (seperti layar, atau File, atau byte array, atau koneksi jaringan, atau lain-lain). Kelas InputStream mengakses hal yang sama, tetapi mereka membaca data dari mereka.

Berikut adalah contoh dasar yang baik menggunakan FileOutputStream dan FileInputStream untuk menulis data ke file, lalu membacanya kembali.

Kaleb Brasee
sumber
4

Aliran adalah aliran cairan, udara, atau gas secara terus menerus.

Java stream adalah aliran data dari sumber ke tujuan. Sumber atau tujuan dapat berupa disk, memori, soket, atau program lain. Data dapat berupa byte, karakter, atau objek. Hal yang sama berlaku untuk aliran C # atau C ++. Metafora yang bagus untuk aliran Jawa adalah air mengalir dari keran ke bak mandi dan kemudian ke drainase.

Data mewakili bagian statis dari aliran; metode baca dan tulis bagian dinamis dari aliran.

InputStreammewakili aliran data dari sumber, yang OutputStreammewakili aliran data ke tujuan. Akhirnya, InputStreamdan OutputStreamabstraksi atas akses tingkat rendah ke data, seperti pointer file C.

Jan Bodnar
sumber
2

Aliran : Dalam istilah awam, aliran adalah data, sebagian besar aliran umum adalah representasi data biner.

Input Stream : Jika Anda membaca data dari file atau sumber lain, aliran yang digunakan adalah aliran input. Dalam istilah yang lebih sederhana, input stream berfungsi sebagai saluran untuk membaca data.

Output Stream : Jika Anda ingin membaca dan memproses data dari sumber (file dll), Anda harus menyimpan data terlebih dahulu, maksud untuk menyimpan data adalah output stream.

Sher Mohammad
sumber
0

Aliran keluaran umumnya terkait dengan beberapa tujuan data seperti file atau jaringan dll. Di aliran output java adalah tujuan di mana data akhirnya ditulis dan berakhir

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");
    }
}
Deep Arora
sumber