2012-01-04 9 views
2

私はorg.apache.commons.net.ftpを使ってリモートマシンのファイルをダウンロードしています。 FileOutputStreamオブジェクトにファイルを読み取るメソッドがあります。FileOutputStreamからファイルを作成

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

問題はここにあります。Fileオブジェクトを受け入れる別の方法があります。ですから、FileオブジェクトファイルFileOutputStreamを作成する必要があります。私はFileOutputStreamからファイルオブジェクトを作成できるように、InputStreamを作成する必要があると思います。これは正しいです?何か不足している可能性があります。FileOutputStreamからFileを簡単に作成する方法がありますか?

+0

InputStreamを作成しないでください。 FileOutputStreamの作成に使用したFileではないはずですか? –

+0

どういう意味ですか:「FileOutputStreamというFileオブジェクトファイルを作成する必要がありますか? – Gangnus

+0

@Peter Lawrey - retrieveFileはFTP経由でファイルを読み取り、ファイルの内容をOutPutStreamに書き込みます – user957183

答えて

5

FileOutputStreamには、Fileオブジェクトを受け取るコンストラクタがあります。

次はあなたがそれを行うために必要なものを行う必要があります。mcfinniganの答えに加えて、あなたは、コードを使用するときにことを知っている必要があることを

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

ご返信ありがとうございます。 FTPを使ってダウンロードしている実際のファイル名は、テーブルの主キーとなり、その周りにビジネスロジックがあるため、FileOutputStreamにFileを作成して渡すことはできません。 – user957183

0

注:

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

Spring統合のremote.fileパッケージを使用している間、私はFTP/SFTPファイルのダウンロード機能で、この問題をencouteredました。私はこのような空のファイル問題を解決するためにそれを使用します:

try (OutputStream downloadedFileStream = LazyInitOutputStream.lazyFileOutputStream(destinationfilePath.toFile())) { 
    remoteFileSession.read(source, downloadedFileStream); 
} 
関連する問題