什么是InputStream和输出流?我们为何以及何时使用它们?

Boh*_*ian 281 java io inputstream outputstream

有人向我解释什么InputStreamOutputStream是谁?

我感到困惑的用例都InputStreamOutputStream.

如果您还可以包含一段代码以与您的解释一起使用,那就太棒了.谢谢!

Chi*_*Uni 215

目标InputStream和目标OutputStream是抽象输入和输出的不同方式:流是文件,网页还是屏幕无关紧要.重要的是您从流中接收信息(或将信息发送到该流中).

InputStream 用于你读取的许多东西.

OutputStream 用于你写的很多东西.

这是一些示例代码.它假设已经创建InputStream instr并且OutputStream osstr已经创建:

int i;

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

instr.close();
osstr.close();
Run Code Online (Sandbox Code Playgroud)

  • 什么是"流"? (62认同)
  • @KorayTugay流通常被定义为一组字符.更确切地说,多个位或字符被称为流. (53认同)
  • String也有多个字符.流与字符串的区别是什么? (14认同)

Arn*_*sch 89

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();
Run Code Online (Sandbox Code Playgroud)

阅读书面内容:

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);
Run Code Online (Sandbox Code Playgroud)

您可以使用其他类型的流来增强读/写.例如,您可以引入缓冲区以提高效率:

DataInputStream stream = new DataInputStream(
    new BufferedInputStream(new FileInputStream(file)));
Run Code Online (Sandbox Code Playgroud)

您可以编写其他数据,如对象:

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

您可以从其他不同的输入源读取:

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);
Run Code Online (Sandbox Code Playgroud)

对于大多数输入流,也有输出流.您可以定义自己的流来读/写特殊事物,并且有复杂的流来读取复杂的东西(例如,有用于读取/写入ZIP格式的Streams).


Rav*_*abu 34

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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序使用字节流将xanadu.txt文件复制到outagain.txt,一次写入一个字节

看看这个SE问题,了解有关高级字符流的更多详细信息,这些字符流是Byte Streams之上的包装器:

字节流和字符流


pst*_*ton 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();
Run Code Online (Sandbox Code Playgroud)

  • `close`总是`flush`es,所以没有. (3认同)

Kal*_*see 5

OutputStream是一个表示写入输出的抽象类.有许多不同的OutputStream类,它们会写出某些内容(如屏幕,文件,字节数组或网络连接等).InputStream类访问相同的东西,但他们从中读取数据.

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


She*_*mad 5

:通俗地说,流就是数据,最通用的流是数据的二进制表示。

输入流:如果您从文件或任何其他源读取数据,则使用的流是输入流。简单来说,输入流充当读取数据的通道。

输出流:如果要从源(文件等)读取和处理数据,首先需要保存数据,存储数据的意思是输出流。


Jan*_*nar 5

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

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

数据代表流的静态部分;read 和 write 方法是流的动态部分。

InputStream表示来自源OutputStream的数据流, 表示到目的地的数据流。最后,InputStream并且OutputStream是在低级别的访问数据,如C文件指针抽象。