什么是InputStream和Output Stream?为什么以及何时使用它们?


290

有人给我解释一下 InputStreamOutputStream是谁?

我对两者的用例感到困惑 InputStreamOutputStream

如果您还可以包括一段代码来进行解释,那将很棒。谢谢!

Answers:


218

的目标InputStreamOutputStream是抽象不同的方式来输入和输出:流是一个文件,网页,或者屏幕不应该的事。重要的是您从流中接收信息(或将信息发送到该流中。)

InputStream 用于阅读的许多内容。

OutputStream 用于写很多东西。

这是一些示例代码。假定InputStream instrOutputStream osstr已经创建:

int i;

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

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

67
什么是“流”?
Koray Tugay 2014年

55
@KorayTugay通常将流定义为一组字符。更准确地说,一个以上的位或字符称为流。
Gowtham Gopalakrishnan 2014年

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教程的示例代码

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问题,以了解有关高级字符流的更多详细信息,这些字符流是字节流的包装器:

字节流和字符流


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
close总是flushes,所以不。
pstanton

5

OutputStream是一个抽象类,代表编写输出。有许多不同的OutputStream类,它们可以写某些内容(例如屏幕,文件,字节数组或网络连接等)。InputStream类访问相同的内容,但是它们从中读取数据。

这是一个使用FileOutputStream和FileInputStream将数据写入文件,然后再读回的好基本示例


4

流是液体,空气或气体的连续流。

Java流是从源到目标的数据流。源或目标可以是磁盘,内存,套接字或其他程序。数据可以是字节,字符或对象。C#或C ++流同样如此。Java流的一个很好的比喻是水从水龙头流入浴缸,然后又流入排水装置。

数据表示流的静态部分;读写方法是流的动态部分。

InputStream代表来自源OutputStream的数据流,代表进入目的地的数据流。最后,InputStreamOutputStream是对低级数据访问(例如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");
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.