我正在使用org.apache.commons.net.ftp
下载远程计算机中的文件。
有一种方法可以将文件读取到FileOutputStream
对象。
ftpClient.retrieveFile("/" + ftpFile.getName(), fos);
问题,这是,我是另一个接受File
对象的方法。所以,我需要创建一个File
目标文件FileOutputStream
。我想,我需要创建一个InputStream
才能从FileOutputStream
创建一个文件对象。它是否正确?我可能会遗漏某些内容,应该有一种简单的方法可以从File
创建FileOutputStream
吗?
答案 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);
}