InputStream & Stream Stream là gì? Tại sao và khi nào chúng ta sử dụng chúng?


290

Ai đó giải thích cho tôi những gì InputStreamOutputStreamđược?

Tôi bối rối về các trường hợp sử dụng cho cả hai InputStreamOutputStream.

Nếu bạn cũng có thể bao gồm một đoạn mã đi kèm với lời giải thích của bạn, điều đó sẽ rất tuyệt. Cảm ơn!

Câu trả lời:


218

Mục tiêu của InputStreamOutputStreamlà trừu tượng hóa các cách khác nhau để nhập và xuất: luồng đó là tệp, trang web hay màn hình không quan trọng. Tất cả vấn đề là bạn nhận được thông tin từ luồng (hoặc gửi thông tin vào luồng đó.)

InputStream được sử dụng cho nhiều thứ mà bạn đọc từ.

OutputStream được sử dụng cho nhiều thứ mà bạn viết.

Đây là một số mã mẫu. Nó giả định InputStream instrOutputStream osstrđã được tạo:

int i;

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

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

67
"Luồng" là gì?
Koray Tugay

55
@KorayTugay Một luồng thường được định nghĩa là một tập hợp các ký tự. Nói chính xác hơn, nhiều hơn một bit hoặc ký tự được gọi là luồng.
Gowtham Gopalakrish Nam

14
Nhiều hơn một ký tự là String. Điều gì phân biệt luồng từ chuỗi?
Prajeet Shrestha

Tôi nghĩ rằng một luồng chỉ là số không và số., Không phải ký tự.
smilyface

93

InputStream được sử dụng để đọc, OutputStream để viết. Chúng được kết nối như các bộ trang trí với nhau để bạn có thể đọc / ghi tất cả các loại dữ liệu khác nhau từ tất cả các loại nguồn khác nhau.

Ví dụ: bạn có thể ghi dữ liệu nguyên thủy vào một tệp:

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

Để đọc nội dung bằng văn bản:

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

Bạn có thể sử dụng các loại luồng khác để tăng cường đọc / viết. Ví dụ: bạn có thể giới thiệu bộ đệm cho hiệu quả:

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

Bạn có thể viết các dữ liệu khác như các đối tượng:

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

Bạn có thể đọc từ các nguồn đầu vào khác nhau:

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

Đối với hầu hết các luồng đầu vào, cũng có một luồng đầu ra. Bạn có thể xác định luồng của riêng mình để đọc / viết những thứ đặc biệt và có những luồng phức tạp để đọc những thứ phức tạp (ví dụ: có Luồng để đọc / ghi định dạng ZIP).


35

Từ Hướng dẫn Java :

Một luồng là một chuỗi dữ liệu.

Một chương trình sử dụng luồng đầu vào để đọc dữ liệu từ một nguồn, mỗi lần một mục:

nhập mô tả hình ảnh ở đây

Một chương trình sử dụng luồng đầu ra để ghi dữ liệu đến đích, một mục tại một thời điểm:

nhập mô tả hình ảnh ở đây

Nguồn dữ liệu và đích dữ liệu trong hình trên có thể là bất cứ thứ gì chứa, tạo hoặc tiêu thụ dữ liệu. Rõ ràng điều này bao gồm các tệp đĩa , nhưng nguồn hoặc đích cũng có thể là một chương trình khác, thiết bị ngoại vi, ổ cắm mạng hoặc mảng .

mẫu từ hướng dẫn 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();
            }
        }
    }
}

Sử dụng chương trình này byte suối để sao chép xanadu.txt tập tin để outagain.txt , bằng cách viết một byte tại một thời điểm

Hãy xem câu hỏi SE này để biết thêm chi tiết về các luồng Nhân vật nâng cao, được bao bọc trên đầu luồng Byte:

luồng byte và luồng ký tự


9

bạn đọc từ InputStream và ghi vào OutputStream.

ví dụ, giả sử bạn muốn sao chép một tập tin. Bạn sẽ tạo một FileInputStream để đọc từ tệp nguồn và FileOutputStream để ghi vào tệp mới.

Nếu dữ liệu của bạn là một luồng ký tự, bạn có thể sử dụng FileReader thay vì InputStream và FileWriter thay vì OutputStream nếu bạn thích.

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
closeluôn luôn flushes, vì vậy không.
pstanton

5

OutputStream là một lớp trừu tượng đại diện cho đầu ra bằng văn bản. Có nhiều lớp OutputStream khác nhau và chúng viết ra một số thứ nhất định (như màn hình, hoặc Tệp, hoặc mảng byte, hoặc kết nối mạng, v.v.). Các lớp InputStream truy cập vào cùng một thứ, nhưng chúng đọc dữ liệu từ chúng.

Dưới đây là một ví dụ cơ bản tốt về việc sử dụng FileOutputStream và FileInputStream để ghi dữ liệu vào một tệp, sau đó đọc lại.


4

Luồng là dòng chảy liên tục của chất lỏng, không khí hoặc khí.

Luồng Java là luồng dữ liệu từ nguồn vào đích. Nguồn hoặc đích có thể là đĩa, bộ nhớ, ổ cắm hoặc các chương trình khác. Dữ liệu có thể là byte, ký tự hoặc đối tượng. Điều tương tự áp dụng cho các luồng C # hoặc C ++. Một phép ẩn dụ tốt cho các luồng Java là nước chảy từ vòi vào bồn tắm và sau đó chảy vào cống.

Dữ liệu đại diện cho phần tĩnh của luồng; phương thức đọc và ghi phần động của luồng.

InputStreamđại diện cho một luồng dữ liệu từ nguồn, OutputStreamđại diện cho một luồng dữ liệu vào đích. Cuối cùng, InputStreamOutputStreamlà sự trừu tượng hóa đối với việc truy cập dữ liệu ở mức độ thấp, chẳng hạn như con trỏ tệp C.


2

Luồng : Trong thuật ngữ laymen, luồng là dữ liệu, hầu hết luồng chung là biểu diễn nhị phân của dữ liệu.

Luồng đầu vào : Nếu bạn đang đọc dữ liệu từ một tệp hoặc bất kỳ nguồn nào khác, luồng được sử dụng là luồng đầu vào. Trong một thuật ngữ đơn giản hơn, luồng đầu vào hoạt động như một kênh để đọc dữ liệu.

Luồng đầu ra : Nếu bạn muốn đọc và xử lý dữ liệu từ một nguồn (tệp, v.v.) trước tiên bạn cần lưu dữ liệu, giá trị trung bình để lưu trữ dữ liệu là luồng đầu ra.


0

Luồng đầu ra thường liên quan đến một số đích dữ liệu như tệp hoặc mạng, v.v ... Trong luồng đầu ra java là đích mà dữ liệu cuối cùng được ghi và kết thúc

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");
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.