0

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

4

1 回答 1

1

我不是inotifyIIRC 基础的 POSIX API专家FileObserver。但是,鉴于 、和有单独的事件CREATE,因此该事件仅用于文件创建——换句话说,在文件系统中为文件分配新条目是合理的。这将创建一个空文件,或者可能是一个具有一些初始字节负载的文件,但可能需要其他调用来写出全部内容。然后将调用以指示正在写入文件的人现在已经关闭了他们的文件句柄。MODIFYCLOSE_WRITECREATEMODIFYCLOSE_WRITE

因此,如果您正在监视要创建的某个文件,请将其读入,监视CREATE,然后监视CLOSE_WRITE同一个文件,然后尝试读取它,看看是否效果更好。

于 2014-12-02T12:37:03.360 回答