2

org.apache.commons.net.ftp用来在远程机器上下载文件。有一种方法可以将文件读取到FileOutputStream对象中。

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

问题是,我有另一种接受File对象的方法。所以,我需要创建一个File目标文件FileOutputStream. 我想,我需要创建一个InputStream能够从FileOutputStream. 这个对吗?我可能遗漏了一些东西,应该有一种简单的方法可以FileFileOutputStream?

4

2 回答 2

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
}
于 2012-01-04T12:16:36.180 回答
0

注意,除了mcfinnigan的回答,在使用代码的时候一定要知道:

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

然后将在第一行的文件系统上创建一个空文件。然后,如果第二行抛出异常,因为 path 不存在远程文件"/" + 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);
        }
      }
    });
  }

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

try ( OutputStream downloadedFileStream = LazyInitOutputStream.lazyFileOutputStream(destinationfilePath.toFile()) ) {
  remoteFileSession.read(source, downloadedFileStream);
}
于 2013-09-18T09:33:44.170 回答