создать файл из FileOutputStream - PullRequest
2 голосов
/ 04 января 2012

Я использую org.apache.commons.net.ftp для загрузки файлов на удаленной машине. Есть метод, который читает файлы в FileOutputStream объект.

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

Проблема, вот, у меня есть другой метод, который принимает File объект. Итак, мне нужно создать File объектный файл FileOutputStream. Я думаю, мне нужно создать InputStream, чтобы иметь возможность создавать файловый объект из FileOutputStream. это правильно? Я мог что-то упустить, и должен быть простой способ создать File из FileOutputStream?

Ответы [ 2 ]

5 голосов
/ 04 января 2012

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
}
0 голосов
/ 18 сентября 2013

Обратите внимание, что в дополнение к ответу mcfinnigan вы должны знать, что при использовании кода:

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

Тогда в вашей файловой системе в первой строке будет создан пустой файл.Затем, если во 2-й строке выдается исключение, поскольку для пути "/" + ftpFile.getName() не существует удаленного файла, пустой файл все равно будет в вашей файловой системе.

Так что я сделал небольшой LazyInitOutputStream с Guava для обработки этого:

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.file с функциями загрузки файлов FTP / SFTP.Я использую это для решения этой проблемы с пустым файлом:

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