所以,你可以通过几种方法保存表单文件,我猜,我使用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();
所以,我的问题是,他们中的两个之间有什么区别,我什么时候应该使用哪个?
答案 0 :(得分:5)
因此,根据您要问的问题,这里有两个不同的答案。 (1)在您的示例中创建的两个OutputStream对象之间是否存在差异? (2)两种对象类型之间是否存在差异?何时应该使用哪种?
(1)
ObjectStream os = new FileObjectStream(File file);
和
FileObjectStream fos = new FileObjectStream(File file);
也不例外。
因为FileObjectStream是抽象ObjectStream的子类,所以可以使用子类构造函数创建Object,并继承所有子类功能。
(2)
OutputStream是一个抽象类,应该由一个Object(如FileOutputStream )进行子类化,以便可以覆盖write(byte[] b)
调用,并且可以添加特定于输出接收器的任何功能。更简单的说,FileOutputStream(以及类似它的OutputStream的子类)"是" OutputStrem对象,但OutputStream不是FileOutputStream对象。
答案 1 :(得分:0)
没有区别。但是,第一个示例更易于编程。事实上,第二个示例仍在使用FileOutputStream
,除非您将其放在OutputStream
变量中。
答案 2 :(得分:0)
您应该刻意编写代码,而不是实际需要的具体代码。
如果你有一个必须引用FileOutputStream
的变量。这意味着,出于某种充分的理由,您无法使用其他OutputStream
。
但是,如果没有充分的理由比OutputStream
更具体,那么这就是你应该使用的。
假设有人必须稍后更改此代码并需要更改OutputStream的类型,例如到BufferedOutputStream
或GZIPOutputStream
。但是,代码说它必须是FileOutputStream
为什么?,没有充分的理由。试图寻找不存在的东西需要更长的时间。
简而言之,要使参考类型与现有的相匹配,而不是现在的情况。
答案 3 :(得分:0)
根据java文档,OutputStream只是FileOutputStream继承的抽象类。此外,您在两个示例中使用它的方式并没有真正显示出实际差异,因为两种情况下的实例仍然是FileOutputStream。第二种情况只允许您以多态方式使用变量,因此如果您不知道在循环的特定迭代中您需要什么类型的输出流,您可以使用抽象类键入变量并将其实例化为任何一个你需要的子类。
答案 4 :(得分:0)
Outputstream是一个抽象类,而FileOutputStream是子类。
您可以使用Outputstream只为字节写入一个现有文件,而不是输出文件。
如果您只是正常编写文件FileOutputStream就可以了