问题描述:ftp上传文件的时候总是先创建了文件,然后再上传。如果此时程序读取文件可能就读取一部分不完成的数据。那么怎么解决才合理呢
方案1.上传文件的客户端先创建一个临时文件名称,然后上传完毕再重命名。而重命名是修改注册表所以不会产生过程中数据不一致的问题
方案2.在ftp客户端上传文件不由我们控制的时候,不能实施第一方案怎么办呢。打开文件在文件尾追加一个标识内容,关闭打开文件,然后在重新打开文件判断追加写入的内容时候成功,如果不成功,说明文件还在被占用,如果成功了就说明ftp上传结束了。这里感谢公司同事小苏为此方案做出的贡献。
这里解释一下,经过多次实验得知ftp客户端上传文件的时候,使用程序在此文件上追加不上内容,而且java代码不报错,所以才有了方案2.
java代码如下:
package com.ehl.tvc.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import org.apache.commons.io.IOUtils;
public class FileUtil {
private static String endTag = "end";
/**
* 判断文件是否写入内容完毕,如果完毕返回true,反之false
* @param f
* @return
*/
public static boolean checkIniTransfered(File f){
OutputStream output = null;
try {
output = new FileOutputStream(f, true);
output.write((endTag+"\n").getBytes());
output.flush();
output.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
IOUtils.closeQuietly(output);
}
InputStream input =null;
try {
input = new FileInputStream(f);
List<String> list = IOUtils.readLines(input);
if(list.size()>0){
String endstr =list.get(list.size()-1);
if(endTag.equals(endstr)){
return true;
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
IOUtils.closeQuietly(input);
}
return false;
}
}