Java 从FileOutputStream创建文件
我正在使用Java 从FileOutputStream创建文件,java,file-io,fileoutputstream,Java,File Io,Fileoutputstream,我正在使用org.apache.commons.net.ftp在远程机器上下载文件。 有一种方法将文件读取到FileOutputStream对象 ftpClient.retrieveFile("/" + ftpFile.getName(), fos); 问题是,我有另一个方法接受文件对象。因此,我需要创建一个文件对象文件FileOutputStream。我想,我需要创建一个InputStream,以便能够从FileOutputStream创建文件对象。这是正确的吗?我可能遗漏了什么,应该有一种
org.apache.commons.net.ftp
在远程机器上下载文件。
有一种方法将文件读取到FileOutputStream
对象
ftpClient.retrieveFile("/" + ftpFile.getName(), fos);
问题是,我有另一个方法接受
文件
对象。因此,我需要创建一个文件
对象文件FileOutputStream
。我想,我需要创建一个InputStream
,以便能够从FileOutputStream
创建文件对象。这是正确的吗?我可能遗漏了什么,应该有一种简单的方法从文件输出流
创建文件
?文件输出流有一个接受文件对象的构造函数
以下内容应满足您的需要:
File f = new File("path/to/my/file");
if(f.createNewFile()) { // may not be necessary
FileOutputStream fos = new FileOutputStream(f); // create a file output stream around f
ftpClient.retrieveFile("/" + ftpFile.getName(), fos);
otherMethod(f); // pass the file to your other method
}
请注意,除了mcfinnigan的答案外,您必须知道,当您使用代码时:
FileOutputStream fos = new FileOutputStream(f); // create a file output stream around f
ftpClient.retrieveFile("/" + ftpFile.getName(), fos);
然后,将在文件系统的第一行创建一个空文件。然后,如果第2行抛出异常,因为路径“/”+ftpFile.getName()
不存在远程文件,则空文件仍将位于文件系统中
所以我用番石榴做了一点LazyInitOutputStream来处理这个问题:
public class LazyInitOutputStream extends OutputStream {
private final Supplier<OutputStream> lazyInitOutputStreamSupplier;
public LazyInitOutputStream(Supplier<OutputStream> outputStreamSupplier) {
this.lazyInitOutputStreamSupplier = Suppliers.memoize(outputStreamSupplier);
}
@Override
public void write(int b) throws IOException {
lazyInitOutputStreamSupplier.get().write(b);
}
@Override
public void write(byte b[]) throws IOException {
lazyInitOutputStreamSupplier.get().write(b);
}
@Override
public void write(byte b[], int off, int len) throws IOException {
lazyInitOutputStreamSupplier.get().write(b,off,len);
}
public static LazyInitOutputStream lazyFileOutputStream(final File file) {
return lazyFileOutputStream(file,false);
}
public static LazyInitOutputStream lazyFileOutputStream(final File file,final boolean append) {
return new LazyInitOutputStream(new Supplier<OutputStream>() {
@Override
public OutputStream get() {
try {
return new FileOutputStream(file,append);
} catch (FileNotFoundException e) {
throw Throwables.propagate(e);
}
}
});
}
retrieveFile不应该创建InputStream吗?该文件不应该是您用来创建FileOutputStream的文件吗?请问,这是什么意思:“我需要创建一个文件对象文件FileOutputStream”@Peter Lawrey-retrieveFile通过FTP读取文件并将文件内容写入OutPutStream@Gangnus-对不起,我说的模棱两可。由于另一种方法只接受一个文件,我需要从FileOutputStream获取一个文件对象。您需要知道创建FileOutputStream时使用了什么文件,我相信您应该在事后尝试了解它是什么。谢谢您的回复。我不认为我可以预先创建一个文件并将其传递给FileOutputStream,因为我通过FTP下载的实际文件名将是表的主键,并且具有一些业务逻辑。
try ( OutputStream downloadedFileStream = LazyInitOutputStream.lazyFileOutputStream(destinationfilePath.toFile()) ) {
remoteFileSession.read(source, downloadedFileStream);
}