从FileOutputStream创建文件

时间:2012-01-04 12:03:21

标签: java file-io fileoutputstream

我正在使用org.apache.commons.net.ftp下载远程计算机中的文件。 有一种方法可以将文件读取到FileOutputStream对象。

ftpClient.retrieveFile("/" + ftpFile.getName(), fos);

问题,这是,我是另一个接受File对象的方法。所以,我需要创建一个File目标文件FileOutputStream。我想,我需要创建一个InputStream才能从FileOutputStream创建一个文件对象。它是否正确?我可能会遗漏某些内容,应该有一种简单的方法可以从File创建FileOutputStream吗?

2 个答案:

答案 0 :(得分:5)

FileOutputStream有一个构造函数,它接受一个File对象。

以下应该做你需要做的事情:

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
}

答案 1 :(得分:0)

请注意,除了mcfinnigan的答案之外,您必须知道在使用代码时:

FileOutputStream fos = new FileOutputStream(f); // create a file output stream around f
ftpClient.retrieveFile("/" + ftpFile.getName(), fos);

然后将在第一行的文件系统上创建一个空文件。然后,如果第二行抛出异常,因为路径"/" + ftpFile.getName()不存在远程文件,空文件仍将在您的文件系统上。

所以我用Guava做了一个小的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);
        }
      }
    });
  }

我在使用Spring集成remote.file软件包时遇到了这个问题,并使用了FTP / SFTP文件下载功能。我用它来解决这个空文件问题:

try ( OutputStream downloadedFileStream = LazyInitOutputStream.lazyFileOutputStream(destinationfilePath.toFile()) ) {
  remoteFileSession.read(source, downloadedFileStream);
}