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);
}