ChatGPT解决这个技术问题 Extra ChatGPT

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

有人向我解释一下 InputStreamOutputStream 是什么?

我对 InputStreamOutputStream 的用例感到困惑。

如果您还可以包含一段代码来配合您的解释,那就太好了。谢谢!


j
jmattheis

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

InputStream 用于您读取的许多内容。

OutputStream 用于您写入的许多内容。

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

int i;

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

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

@KorayTugay 流通常定义为一组字符。更准确地说,不止一位或一个字符被称为流。
字符串也不止一个字符。流和字符串有什么区别?
我认为流只是零和一,而不是字符。
@PrajeetShrestha我认为流还暗示数据数据是顺序可用的(无随机访问)而不是持久的(不能重新读取或修改写入的数据)。数据也可能在请求时不可用。例如,如果通过网络流式传输。
流数据意味着数据以二进制格式表示。即0和1
s
super7egazi

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 格式的流)。


u
user207421

Java Tutorial

流是数据序列。

程序使用输入流从源中读取数据,一次读取一项:

https://i.stack.imgur.com/7IT8V.gif

程序使用输出流将数据写入目标,一次写入一项:

https://i.stack.imgur.com/qzDzU.gif

上图中的数据源和数据目的地可以是任何保存、生成或使用数据的东西。显然这包括磁盘文件,但源或目标也可以是另一个程序、外围设备、网络套接字或阵列。

来自 oracle 教程的示例 code

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 question 以了解有关高级字符流的更多详细信息,它们是 Byte Streams 之上的包装器:

byte stream and character stream


p
pstanton

您从 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();

close 总是flush,所以没有。
什么是缓冲区?为什么它用于?它是如何工作的?
K
Kaleb Brasee

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

这是使用 FileOutputStream 和 FileInputStream 将数据写入文件,然后将其读回的a good basic example


J
Jan Bodnar

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

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

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

InputStream 表示来自源的数据流,OutputStream 表示进入目标的数据流。最后,InputStreamOutputStream 是对低级数据访问的抽象,例如 C 文件指针。


C
Community

流:在外行术语中流是数据,大多数通用流是数据的二进制表示。

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

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


s
slfan

输出流通常与某些数据目的地有关,例如文件或网络等。在 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");
    }
}

b
bjmd

对于一种 InputStream,您可以将其视为数据源的“表示”,就像文件一样。例如:

FileInputStream fileInputStream = new FileInputStream("/path/to/file/abc.txt");

fileInputStream 表示此路径中的数据,您可以使用 read 方法从文件中读取字节。

对于其他类型的 InputStream,他们接受另一个 inputStream 并进行进一步的处理,例如解压缩。例如:

GZIPInputStream gzipInputStream = new GZIPInputStream(fileInputStream);

gzipInputStream 会将 fileInputStream 视为压缩数据源。当您使用 read(buffer, 0, buffer.length) 方法时,它会将 gzip 文件的一部分解压缩到您提供的缓冲区中。

我们之所以使用 InputStream 是因为随着源中的数据越来越大,比如说我们在源文件中有 500GB 的数据,我们不想把所有的东西都保存在内存中(昂贵的机器;对 GC 分配不友好),我们希望更快地获得一些结果(读取整个文件可能需要很长时间)。

OutputStream 也是如此。我们可以开始将一些结果移动到目的地,而无需等待整个事情完成,加上更少的内存消耗。

如果您需要更多解释和示例,请查看以下摘要:InputStreamOutputStreamHow To Use InputStreamHow To Use OutputStream


l
lingar

用我简单的话来说,继续其他伟大的答案:

流 - 就像提到的@Sher Mohammad 是数据。

输入流——例如是从文件中获取输入——数据。情况是当我有一个文件(用户上传一个文件 - 输入) - 我想阅读我们在那里的内容。

输出流 – 反之亦然。例如 - 您正在生成一个 excel 文件,并将其输出到某个地方。

“如何写入”文件是在发送者(excel 工作簿类)而不是在文件输出流中定义的。

请参阅此上下文中的 here 示例。

try (OutputStream fileOut = new FileOutputStream("xssf-align.xlsx")) {
    wb.write(fileOut);
}
wb.close();