FileOutputStream 与 OutputStream,为什么以及何时?

FileOutputStream vs OutputStream, why and when?

所以,你可以通过几种方法保存一个表单文件,我想,我用了2,但我不知道什么时候用哪个。我有这两段代码做同样的事情:

1-这会将我的表单文件写入指定路径。

FormFile archivo = myForm.getArchivo();
File newFile = new File(path, archivo.getFileName());
FileOutputStream fos = new FileOutputStream(newFile);
fos.write(archivo.getFileData());
fos.flush();
fos.close();

2-这也是。

FormFile archivo = myForm.getArchivo();
InputStream in = archivo.getInputStream();
OutputStream bos = new FileOutputStream(path + "archivo.ext");

int byteRead = 0;
byte[] buffer = new byte[8192];
while ((byteRead = in.read(buffer, 0, 8192)) != -1) {
     bos.write(buffer, 0, byteRead);
}
bos.close();
in.close();

那么,我的问题是,这两者之间有什么区别,我什么时候应该使用哪个?

没有区别。但是,第一个示例更易于编程。事实上,第二个例子仍然使用 FileOutputStream,只是你把它放在一个 OutputStream 变量中。

您应该有意识地编写代码,不要比您实际需要的更具体。

如果您有一个必须引用 FileOutputStream 的变量,请使用它。这意味着你不能使用其他一些 OutputStream 出于某种充分的理由。

但是,如果没有比 OutputStream 更具体的充分理由,这就是您应该使用的。

假设某人稍后必须更改此代码并且需要更改 OutputStream 的类型,例如BufferedOutputStreamGZIPOutputStream。但是,代码说它必须是 FileOutputStream 为什么?没有充分的理由。试图找到不存在的东西需要更长的时间。

简而言之,使引用的类型与其必须的匹配,而不是现在的匹配。

根据 java 文档,OutputStream 只是 FileOutputStream 继承自的抽象 class。此外,您在两个示例中使用它的方式并没有真正显示出实际差异,因为两种情况下的实例仍然是 FileOutputStream。第二种情况只允许您以多态方式使用变量,因此如果您不知道在循环的特定迭代中可能需要哪种类型的输出流,您可以使用抽象 class 键入变量并实例化它到您需要的任何子class。

因此,根据您要问的问题,此处有两种不同的答案。 (1) 在您的示例中创建的两个 OutputStream 对象之间是否存在差异?以及 (2) 两种 Object 类型之间有区别吗?应该在什么时候使用它们?

(1)

ObjectStream os = new FileObjectStream(File file);

FileObjectStream fos = new FileObjectStream(File file);

没有区别。

因为 FileObjectStream 是抽象 ObjectStream 的子class,所以可以使用 subclass 构造函数创建对象,并将继承所有 subclass 功能。

(2) OutputStream 是一个抽象 class,应该由 FileOutputStream 等对象 class 子 ,以便 write(byte[] b) 调用可以被覆盖和可以添加特定于输出接收器的任何功能。更简单地说,FileOutputStream(和 OutputStream 的子classes 类似)"is a" OutputStrem 对象,但 OutputStream 不是 FileOutputStream 对象。

Outputstream 是一个抽象 class 而 FileOutputStream 是子 class。

您可以使用 Outputstream 仅以字节为单位写入现有文件,而不是输出文件。

如果您只是正常地写入一个文件,FileOutputStream 是可行的方法