有人向我解释InputStream
和OutputStream
是什么?
我对InputStream
和OutputStream
的使用案例感到困惑。
如果您还可以附上一段代码以便与您的解释一致,那就太棒了。谢谢!
答案 0 :(得分:198)
InputStream
和OutputStream
的目标是抽象输入和输出的不同方式:流是文件,网页还是屏幕无关紧要。重要的是您从流中接收信息(或将信息发送到该流中。)
InputStream
用于您阅读的许多内容。
OutputStream
用于您撰写的许多内容。
这是一些示例代码。它假设已经创建了InputStream instr
和OutputStream osstr
:
int i;
while ((i = instr.read()) != -1) {
osstr.write(i);
}
instr.close();
osstr.close();
答案 1 :(得分:85)
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格式的Streams)。
答案 2 :(得分:28)
流是一系列数据。
程序使用输入流从源读取数据,一次只读取一项:
程序使用输出流将数据写入目标,一次一项:
上图所示的数据源和数据目标可以是保存,生成或使用数据的任何内容。显然这包括磁盘文件,但源或目标也可以是其他程序,外围设备,网络套接字或阵列。
来自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问题,了解有关高级字符流的更多详细信息,这些字符流是Byte Streams之上的包装器:
答案 3 :(得分: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();
答案 4 :(得分:5)
OutputStream是一个表示写入输出的抽象类。有许多不同的OutputStream类,它们会写出某些内容(如屏幕,文件,字节数组或网络连接等)。 InputStream类访问相同的东西,但是它们从中读取数据。
以下是使用FileOutputStream和FileInputStream将数据写入文件的a good basic example,然后将其读回。
答案 5 :(得分:3)
溪流是连续的液体,空气或气体流。
Java流是来自源或目标的数据流。源或目标可以是磁盘,内存,套接字或其他程序。数据可以是字节,字符或对象。这同样适用于C#或C ++流。 Java流的一个很好的比喻是水从水龙头流入浴缸,然后流入排水管。
数据代表流的静态部分;读取和写入方法是流的动态部分。
InputStream
表示来自源的数据流,OutputStream
表示进入目标的数据流。
最后,InputStream
和OutputStream
是对数据的低级访问的抽象,例如C文件指针。
答案 6 :(得分:2)
流:在非专业术语中,流是数据,大多数通用流是数据的二进制表示。
输入流:如果您正在从文件或任何其他来源读取数据,则使用的流是输入流。简而言之,输入流充当读取数据的通道。
输出流:如果要从源(文件等)读取和处理数据,首先需要保存数据,存储数据的平均值是输出流。
答案 7 :(得分: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");
}
}
答案 8 :(得分:0)
输入流
可以使用关键字new创建对象,并且有几种可用的构造函数
以下构造函数将文件名作为字符串来创建输入流对象以读取文件
InputStream f = new FileInputStream("input.txt");
以下构造函数使用文件对象来创建输入流对象以读取文件。首先,我们使用File()方法创建一个文件对象,如下所示:
File f = new File(“input.txt");
InputStream f = new FileInputStream(f);
输出流
FileOutputStream用于创建文件并将数据写入其中
在打开流进行输出之前,流将创建一个文件(如果尚不存在)
这里有两个构造函数,可用于创建FileOutputStream对象
以下构造函数将文件名作为字符串来创建用于写入文件的输入流对象
OutputStream f = new FileOutputStream(“output.txt")
以下构造函数使用文件对象来创建输出流对象以写入文件。首先,我们使用File()方法创建一个文件对象,如下所示:
File f = new File(“output.txt");
OutputStream f = new FileOutputStream(f);
答案 9 :(得分:0)
对于一种 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 也是一样。我们可以开始将一些结果移动到目的地,而无需等待整个事情完成,而且内存消耗更少。
如果您需要更多解释和示例,请查看以下摘要:InputStream、OutputStream、How To Use InputStream、How To Use OutputStream
答案 10 :(得分:0)
继续其他很棒的答案,用我简单的话来说:
Stream - 就像提到的@Sher Mohammad 是数据。
输入流 - 例如从文件中获取输入——数据。案例是当我有一个文件(用户上传文件 - 输入) - 我想阅读我们在那里拥有的内容。
输出 Stream – 反之亦然。例如 - 您正在生成一个 excel 文件,并将其输出到某个地方。
“如何写入”文件是在发送方(excel 工作簿类)而不是文件输出流中定义的。
请参阅此上下文中的 here 示例。
try (OutputStream fileOut = new FileOutputStream("xssf-align.xlsx")) {
wb.write(fileOut);
}
wb.close();