注:
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);
}
InputStreamを作成しないでください。 FileOutputStreamの作成に使用したFileではないはずですか? –
どういう意味ですか:「FileOutputStreamというFileオブジェクトファイルを作成する必要がありますか? – Gangnus
@Peter Lawrey - retrieveFileはFTP経由でファイルを読み取り、ファイルの内容をOutPutStreamに書き込みます – user957183