有人能解释一下什么是输入流和输出流吗?
我对InputStream和OutputStream的用例感到困惑。
如果你能在解释的同时附上一段代码,那就太好了。谢谢!
有人能解释一下什么是输入流和输出流吗?
我对InputStream和OutputStream的用例感到困惑。
如果你能在解释的同时附上一段代码,那就太好了。谢谢!
当前回答
OutputStream是表示写入输出的抽象类。有许多不同的OutputStream类,它们写入特定的东西(如屏幕、文件、字节数组或网络连接等)。InputStream类访问相同的东西,但是它们从中读取数据。
下面是一个很好的基本示例,使用FileOutputStream和FileInputStream将数据写入文件,然后再将其读入。
其他回答
来自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问题,了解更多关于高级字符流的细节,它是字节流上的包装器:
字节流和字符流
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格式的流)。
InputStream和OutputStream的目标是抽象输入和输出的不同方式:流是文件、网页还是屏幕都不重要。重要的是您从流中接收信息(或将信息发送到流中)。
InputStream用于读取的许多内容。
OutputStream用于很多你写入的东西。
下面是一些示例代码。它假设InputStream instr和OutputStream osstr已经创建:
int i;
while ((i = instr.read()) != -1) {
osstr.write(i);
}
instr.close();
osstr.close();
OutputStream是表示写入输出的抽象类。有许多不同的OutputStream类,它们写入特定的东西(如屏幕、文件、字节数组或网络连接等)。InputStream类访问相同的东西,但是它们从中读取数据。
下面是一个很好的基本示例,使用FileOutputStream和FileInputStream将数据写入文件,然后再将其读入。
你从一个输入流中读取并写入输出流。
例如,假设您想复制一个文件。您将创建一个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();