InputStream ve Output Stream nedir? Neden ve ne zaman kullanıyoruz?


290

Birisi neler olduğunu açıklar InputStreamve OutputStreamnelerdir?

Her ikisi için kullanım durumları hakkında karıştı InputStreamve OutputStream.

Açıklamanızla birlikte gitmek için bir kod snippet'i de ekleyebiliyorsanız, bu harika olurdu. Teşekkürler!

Yanıtlar:


218

Amaç InputStreamve OutputStreamgiriş ve çıkış için farklı yollar özetlemektir: akışın bir dosya mı, bir web sayfası mı yoksa ekran mı olduğu önemli değildir. Önemli olan tek şey akıştan bilgi almanız (veya bu akışa bilgi göndermeniz).

InputStream okuduğunuz birçok şey için kullanılır.

OutputStream yazdığınız birçok şey için kullanılır.

İşte bazı örnek kod. Bu devraldı InputStream instrve OutputStream osstrzaten oluşturulmuştur:

int i;

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

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

67
"Akış" nedir?
Koray Tugay

55
@KorayTugay Akış, genellikle bir karakter kümesi olarak tanımlanır. Daha kesin olmak gerekirse, birden fazla bit veya karakter akış olarak adlandırılır.
Gowtham Gopalakrishnan

14
Birden fazla karakter String'dir. Akışı dizeden ayıran nedir?
Prajeet Shrestha

Bence bir akış sadece sıfırlar ve birler. Karakterler değil.
smilyface

93

InputStream okumak için, OutputStream yazmak için kullanılır. Dekoratörler olarak birbirine bağlanırlar, böylece tüm farklı kaynak türlerinden tüm veri türlerini okuyabilir / yazabilirsiniz.

Örneğin, bir dosyaya ilkel veriler yazabilirsiniz:

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

Yazılı içeriği okumak için:

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

Okuma / yazmayı geliştirmek için diğer akış türlerini kullanabilirsiniz. Örneğin, verimlilik için bir tampon ekleyebilirsiniz:

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

Nesneler gibi başka veriler de yazabilirsiniz:

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

Diğer farklı giriş kaynaklarından okuyabilirsiniz:

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

Çoğu giriş akışı için bir çıkış akışı da vardır. Özel şeyleri okumak / yazmak için kendi akışlarınızı tanımlayabilirsiniz ve karmaşık şeyleri okumak için karmaşık akışlar vardır (örneğin ZIP formatını okumak / yazmak için Akımlar vardır).


35

Gönderen Java Eğitimi :

Akış bir veri dizisidir.

Bir program, her defasında bir öğe olmak üzere bir kaynaktan veri okumak için bir giriş akışı kullanır:

resim açıklamasını buraya girin

Bir program, bir hedefe her seferinde bir öğe yazmak için bir çıkış akışı kullanır:

resim açıklamasını buraya girin

Yukarıda gösterilen veri kaynağı ve veri hedefi, verileri tutan, üreten veya tüketen herhangi bir şey olabilir. Açıkçası bu disk dosyalarını içerir , ancak bir kaynak veya hedef başka bir program, bir çevresel aygıt, bir ağ soketi veya bir dizi olabilir .

Oracle öğreticisinden örnek kod :

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

Bu program kullandığı bayt kopyalamak akışları xanadu.txt dosyayı outagain.txt , bir seferde bir bayt yazarak

Byte Akışlarının üstündeki sarmalayıcılar olan gelişmiş Karakter akışları hakkında daha fazla ayrıntı öğrenmek için bu SE sorusuna bir göz atın:

bayt akışı ve karakter akışı


9

bir InputStream'den okur ve bir OutputStream öğesine yazarsınız.

örneğin, bir dosyayı kopyalamak istediğinizi varsayalım. Kaynak dosyadan okumak için bir FileInputStream ve yeni dosyaya yazmak için bir FileOutputStream oluşturabilirsiniz.

Verileriniz bir karakter akışı ise, bir InputStream yerine bir FileReader ve isterseniz bir OutputStream yerine bir FileWriter kullanabilirsiniz.

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
closeher zaman flushes, yani hayır.
pstanton

5

OutputStream yazma çıktısını temsil eden soyut bir sınıftır. Birçok farklı OutputStream sınıfı vardır ve belirli şeylere (ekran, Dosyalar veya bayt dizileri veya ağ bağlantıları vb.) Yazarlar. InputStream sınıfları aynı şeylere erişir, ancak onlardan veri okurlar.

Burada bir dosyaya veri yazmak için FileOutputStream ve FileInputStream kullanmanın iyi bir temel örneği , sonra tekrar okuyun.


4

Bir akış, sürekli bir sıvı, hava veya gaz akışıdır.

Java akışı, bir kaynaktan bir hedefe veri akışıdır. Kaynak veya hedef bir disk, bellek, soket veya diğer programlar olabilir. Veriler bayt, karakter veya nesne olabilir. Aynısı C # veya C ++ akışları için de geçerlidir. Java akışları için iyi bir metafor, bir musluktan küvete ve daha sonra bir drenaja akan sudur.

Veriler akışın statik kısmını temsil eder; akışın dinamik kısmını okuma ve yazma yöntemleri.

InputStreamkaynaktan OutputStreamveri akışını, hedefe veri akışını temsil eder. Son olarak, InputStreamve OutputStreamC dosya işaretçileri gibi verilere düşük seviyeli erişim üzerindeki soyutlamalardır.


2

Akış : Laymen terimlerinde akış verilerdir, çoğu genel akış verilerin ikili temsilidir.

Giriş Akışı : Bir dosyadan veya başka bir kaynaktan veri okuyorsanız, kullanılan akış giriş akışıdır. Daha basit bir ifadeyle, girdi akışı verileri okumak için bir kanal görevi görür.

Çıktı Akışı : Bir kaynaktan (dosya vb.) Veri okumak ve işlemek istiyorsanız, önce verileri kaydetmeniz gerekir, veri depolamanın ortalaması çıktı akışıdır.


0

Bir çıkış akışı genellikle bir dosya veya ağ vb. Gibi bazı veri hedefleriyle ilgilidir. Java çıktı akışı, verilerin sonunda yazıldığı ve bittiği bir hedeftir.

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");
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.