什么是输入流和输出流?我们为什么以及何时使用它们?
-
11-09-2019 - |
题
有人向我解释一下什么 InputStream
和 OutputStream
是?
我对两者的用例感到困惑 InputStream
和 OutputStream
.
如果您还可以包含一段代码来配合您的解释,那就太好了。谢谢!
解决方案
InputStream
和OutputStream
的目标是抽象不同的方式来输入和输出:流是一个文件,网页,或者屏幕不应该的问题。所有重要的是,你从流接收信息(或发送信息转换为流。)
InputStream
用于您从阅读许多东西。
OutputStream
用于您写入许多东西。
下面是一些示例代码。它假定InputStream instr
和OutputStream osstr
已经创建:
int i;
while ((i = instr.read()) != -1) {
osstr.write(i);
}
instr.close();
osstr.close();
其他提示
的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格式)。
来自 Java教程:
流是数据序列。
程序使用输入流从源读取数据,一次读取一项:
程序使用输出流将数据写入目标,一次一项:
上图所示的数据源和数据目的地可以是保存、生成或消耗数据的任何东西。显然这包括 磁盘文件, ,但源或目的地也可以是 另一个程序、外围设备、网络套接字或数组.
样本 代码 来自甲骨文教程:
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();
}
}
}
}
该程序使用字节流来复制 世外桃源.txt 文件至 再次出击.txt , 一次写入一个字节
看一下这个 SE 问题,了解有关高级字符流的更多详细信息,这些字符流是字节流之上的包装器:
在从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();
的OutputStream是表示写入输出的抽象类。有许多不同的OutputStream类,他们写出来给某些事情(比如屏幕,或文件,或字节数组,或网络连接,或等)。的InputStream类访问相同的事情,但它们在由它们读取的数据。
下面是良好的基本示例使用FileOutputStream中和的FileInputStream将数据写入到一个的文件,然后读回。
一个流是液体,空气或气体的连续流。
Java流是数据从源或入的目的地的流动。源或目标可以是磁盘,存储器,插座,或其他程序。该数据可以是字节,字符,或对象。这同样适用于C#或C ++流。一个很好的隐喻Java流是水从水龙头流入浴缸后来进入排水。
在数据表示流的静态部分;在读取和写入方法流的动态部分。
InputStream
表示数据从源流动,所述OutputStream
表示数据的流动到目标。
最后,InputStream
和OutputStream
是抽象的过度低级别的访问到的数据,如C文件指针。
溪流: :通俗地说,流就是数据,最通用的流是数据的二进制表示。
输入流 :如果您正在从文件或任何其他源读取数据,则使用的流是输入流。简单来说,输入流充当读取数据的通道。
输出流 :如果你想从源(文件等)读取和处理数据,你首先需要保存数据,存储数据的意思是输出流。
和的输出流一般涉及像文件或网络etc.In 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");
}
}