我需要在android中实现一项服务,该服务必须能够监视文件夹以检测某个文件并读取它包含的内容。我的代码有一种奇怪的行为,我找不到原因。这是我的相关代码。
public void onCreate(){
lectorFichCSV = new LectorFichCSV(); //object to read CSV files
ftpFileObserver = new FileObserver(filePath.getAbsolutePath()){
public void onEvent(int event, String file) {
if((FileObserver.CREATE & event) != 0){
Log.i("INFO: ", filePath.getAbsolutePath() + "/" + file + " is created");
if(file.substring(0,3).equals("RVE")){ //If file is created and the one I expect
try{
Log.i("INFO: ", "We have a RVE answer");
is = new FileInputStream(filePath + "/" + file);
lineaVent = lectorFichCSV.parseCSVFileAsList(is); //Get information in a list
//Get dao from ORMLite
dao = getHelper().getLineaVentDao();
Iterator<String[]> iterator = lineaVent.iterator();
if(iterator.hasNext()){
String[] aux = iterator.next();
Log.i("INFO:", "CodLineaVent "+aux[0]);
if(aux[2].equals("S")){
//Update DB information accordin to my file
UpdateBuilder<LineaVent, Integer> updateBuilder = dao.updateBuilder();
updateBuilder.where().eq("_id", aux[0]);
updateBuilder.updateColumnValue("valido", true);
updateBuilder.updateColumnValue("saldo", true);
updateBuilder.update();
lineaVent.clear();
}else if(aux[2].equals("N")){
UpdateBuilder<LineaVent, Integer> updateBuilder = dao.updateBuilder();
updateBuilder.where().eq("_id", aux[0]);
updateBuilder.updateColumnValue("saldo", false);
updateBuilder.update();
lineaVent.clear();
}
File fileToDel = new File(filePath + "/" + file);
fileToDel.delete();
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
}
我调试了代码,有时候工作正常,有时候我得到了lineaVent.size()== 0.我对此感到很疯狂,我在想,事件是否可能比我的文件创建更快?这是我尝试将我的CSV文件解析为List对象的原因是size = 0?在那种情况下,我没有得到任何FileNotFoundException。 任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
我不是inotify
POSIX API的专家,IIRC是FileObserver
的基础。但是,鉴于CREATE
,MODIFY
和CLOSE_WRITE
都有单独的事件,因此CREATE
事件仅用于创建文件 - 换句话说,在文件系统中为文件分配一个新条目。这将创建一个空文件,或者可能是一个初始加载字节的文件,但可能需要其他MODIFY
调用来写出完整内容。然后会调用CLOSE_WRITE
来表明写入文件的人现在已经关闭了文件句柄。
因此,如果您正在观看要创建的某个文件,要将其读入,请注意CREATE
,然后在该文件上查看CLOSE_WRITE
,然后尝试阅读它,看看它是否更好。