接到一个任务:为了确保安全,在删除ftp服务器上文件之前需要用1k大小的随机数重写该文件。
该操作需要用到Apache commons-net 包下面的FTPClient类,为了重写文件,我用到了该类的storeFileStream(String remote)方法,该方法返回一个OutputStream,起初没注意到OutputStream的flush和close方法就调用FTPClient类的deleteFile方法,如果该方法运行成功则返回true,但是碰到了一个奇怪的现象,deleteFile方法返回了true并没有删除文件。CSDN的网友告诉我可能是因为有文件打开着,并没有删除成功。
后来我调用了OutputStream的flush和close方法。读写第一个文件时总是正确的,当相同API读写第二个文件时,block住了。好友海波提醒了我storeFileStream(String remote)方法因为不能马上处理流,所以需要用户手工调用completePendingCommand。FTPClient要求在进行流操作之后执行completePendingCommand,以确保流处理完毕,因为流处理不是即时的,所以也没有办法手工调用completePendingCommand。于是改用public boolean storeFile(String remote, InputStream local)方法,成功解决该问题。