InputStream & Output Stream คืออะไร ทำไมและเมื่อไหร่ที่เราจะใช้พวกเขา?


290

มีคนอธิบายให้ฉันเป็นอะไรInputStreamและOutputStreamเป็นอย่างไร

ฉันกำลังสับสนเกี่ยวกับกรณีการใช้งานสำหรับทั้งสองและInputStreamOutputStream

หากคุณสามารถใส่ตัวอย่างของรหัสเพื่อไปพร้อมกับคำอธิบายของคุณนั่นจะเป็นสิ่งที่ยอดเยี่ยม ขอบคุณ!

คำตอบ:


218

เป้าหมายของInputStreamและOutputStreamเพื่อสรุปวิธีการอินพุตและเอาต์พุตที่เป็นนามธรรม: ไม่ว่าสตรีมจะเป็นไฟล์หน้าเว็บหรือหน้าจอไม่ควรสำคัญ สิ่งที่สำคัญคือคุณได้รับข้อมูลจากสตรีม (หรือส่งข้อมูลไปยังสตรีมนั้น)

InputStream ใช้สำหรับหลายสิ่งที่คุณอ่าน

OutputStream ใช้สำหรับหลายสิ่งที่คุณเขียนถึง

นี่คือตัวอย่างรหัส มันถือว่าInputStream instrและOutputStream osstrได้ถูกสร้างขึ้นแล้ว:

int i;

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

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

67
"สตรีม" คืออะไร?
Koray Tugay

55
@KorayTugay โดยทั่วไปสตรีมจะถูกกำหนดเป็นชุดอักขระ เพื่อให้มีความแม่นยำมากขึ้นมีการเรียกบิตหรืออักขระมากกว่าหนึ่งตัวเป็นสตรีม
Gowtham Gopalakrishnan

14
อักขระมากกว่าหนึ่งตัวคือสตริงด้วย สตรีมที่แตกต่างจากสตริงคืออะไร
Prajeet Shrestha

ฉันคิดว่าสตรีมเป็นเพียงศูนย์และอันไม่ใช่ตัวละคร
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 :

กระแสข้อมูลเป็นลำดับของข้อมูล

โปรแกรมใช้สตรีมอินพุตเพื่ออ่านข้อมูลจากแหล่งหนึ่งรายการต่อครั้ง:

ป้อนคำอธิบายรูปภาพที่นี่

โปรแกรมใช้เอาต์พุตสตรีมเพื่อเขียนข้อมูลไปยังปลายทางหนึ่งไอเท็มต่อครั้ง:

ป้อนคำอธิบายรูปภาพที่นี่

แหล่งข้อมูลและปลายทางข้อมูลภาพด้านบนสามารถเป็นสิ่งที่เก็บสร้างหรือใช้ข้อมูล เห็นได้ชัดว่านี้รวมถึงไฟล์ดิสก์แต่ต้นทางหรือปลายทางยังสามารถเป็นโปรแกรมอื่นอุปกรณ์ต่อพ่วง, ซ็อกเก็ตเครือข่ายหรืออาร์เรย์

โค้ดตัวอย่างจาก oracle tutorial:

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

นี้ใช้โปรแกรมไบต์ลำธารเพื่อคัดลอกxanadu.txtไฟล์outagain.txt , โดยการเขียนหนึ่งไบต์ในเวลา

ดูคำถาม SE นี้เพื่อทราบรายละเอียดเพิ่มเติมเกี่ยวกับตัวละครขั้นสูงซึ่งเป็นบทสรุปของ Byte Streams:

กระแสไบต์และตัวละครสตรีม


9

คุณอ่านจาก InputStream และเขียนไปยัง OutputStream

ตัวอย่างเช่นสมมติว่าคุณต้องการคัดลอกไฟล์ คุณจะสร้าง FileInputStream เพื่ออ่านจากไฟล์ต้นฉบับและ FileOutputStream เพื่อเขียนไปยังไฟล์ใหม่

หากข้อมูลของคุณเป็นตัวละครสตรีมคุณสามารถใช้ FileReader แทน InputStream และ FileWriter แทนที่จะเป็น OutputStream หากคุณต้องการ

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
closeflushes เสมอดังนั้นไม่
pstanton

5

OutputStream เป็นคลาสนามธรรมที่แสดงถึงการเขียนออก มีคลาส OutputStream ที่แตกต่างกันมากมายและพวกเขาเขียนออกไปยังบางสิ่ง (เช่นหน้าจอหรือไฟล์หรืออาร์เรย์ไบต์หรือการเชื่อมต่อเครือข่ายหรืออื่น ๆ ) ชั้นเรียน InputStream เข้าถึงสิ่งเดียวกัน แต่พวกเขาอ่านข้อมูลจากพวกเขา

นี่เป็นตัวอย่างพื้นฐานที่ดีในการใช้ FileOutputStream และ FileInputStream เพื่อเขียนข้อมูลลงในไฟล์จากนั้นอ่านกลับมาใหม่


4

กระแสคือการไหลของของเหลวอากาศหรือก๊าซอย่างต่อเนื่อง

กระแส Java คือการไหลของข้อมูลจากแหล่งที่มาสู่ปลายทาง ต้นทางหรือปลายทางสามารถเป็นดิสก์หน่วยความจำซ็อกเก็ตหรือโปรแกรมอื่น ๆ ข้อมูลสามารถเป็นไบต์อักขระหรือวัตถุ เช่นเดียวกับสตรีม C # หรือ C ++ อุปมาที่ดีสำหรับสายน้ำจาวาคือน้ำที่ไหลจากก๊อกลงในอ่างอาบน้ำ

ข้อมูลแสดงถึงส่วนที่คงที่ของกระแส วิธีการอ่านและเขียนส่วนไดนามิกของกระแส

InputStreamหมายถึงการไหลของข้อมูลจากแหล่งที่มาการOutputStreamไหลของข้อมูลลงในปลายทาง ในที่สุดInputStreamและOutputStreamเป็น abstractions ผ่านการเข้าถึงข้อมูลในระดับต่ำเช่นตัวชี้ไฟล์ 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.