Android服务文件观察者奇怪的行为

时间:2014-12-02 12:17:41

标签: android service fileobserver

我需要在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。 任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

我不是inotify POSIX API的专家,IIRC是FileObserver的基础。但是,鉴于CREATEMODIFYCLOSE_WRITE都有单独的事件,因此CREATE事件仅用于创建文件 - 换句话说,在文件系统中为文件分配一个新条目。这将创建一个空文件,或者可能是一个初始加载字节的文件,但可能需要其他MODIFY调用来写出完整内容。然后会调用CLOSE_WRITE来表明写入文件的人现在已经关闭了文件句柄。

因此,如果您正在观看要创建的某个文件,要将其读入,请注意CREATE,然后在该文件上查看CLOSE_WRITE,然后尝试阅读它,看看它是否更好。