1

我在带有用户名和电话号码的目录中有文本文件列表。每次用户更改电话号码时,它都会保存在同一目录中的新文件中。现在我正在搜索其条目存在于多个文件中的用户。我该怎么做找到最后修改文件的名称..?下面是我目前想出的代码片段。

public static String queryFile() throws IOException{

    File directory = new File("E:\\idm\\users\\output");
    Boolean isUserPresent = false;
    String queryUser = "Mar25-user6";
    ArrayList arr = new ArrayList();

    if(directory.isDirectory())
    {
        File[] fileNames = directory.listFiles();
        for(int i=0;i<fileNames.length;i++)
        {
          BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileNames[i])));
          while((line = reader.readLine()) != null)
          {
            if(line.contains(queryUser))
            {
                arr.add(fileNames[i]);

            }
          }

        }

        /*
         how to check the last modified file from among files present in Arraylist arr.
         */

         if (arr.isEmpty)
         {
         isUserPresent = false;
         return "";
         }
         else
         {
         isUserPresent = true;
        // return name of file if user present
         }   
    }
}

通过 javadoc 我发现 File.lastModified() 函数。比较这个函数返回的值是唯一的选择吗..?

4

5 回答 5

1

您可以在您的else块中使用此代码来返回包含用户名的最新文件(arr 是列表具有包含用户名的所有文件的名称):

Collections.sort(arr, new Comparator<File>() {
    @Override
    public int compare(String file1, String file2) {
      return Long.valueOf(new File(file2).lastModified()).compareTo(
                    new File(file1).lastModified());

    }

});

arr.get(0); //
于 2013-04-01T12:16:32.880 回答
0

用于 file.lastModified()获取每个文件的最后修改日期,然后相互比较

于 2013-04-01T12:15:24.760 回答
0

Java 没有用于这项工作的现成 API,但可以通过使用该.lastModified()方法在日期周围放置一些逻辑来轻松实现它,或者您也可以使用Apache FileUtils. 我会推荐使用 Apache Utils。

我会这样做:

  1. 为包含与您的查询匹配的数据的文件声明一个列表
  2. 遍历Directory并将文件匹配放在上面的List中
  3. 最后,遍历第一个 List 并检查最大修改日期

这只是一个想法,您也可以通过遍历目录列表来实现相同的目的。

于 2013-04-01T12:15:48.597 回答
0

要获取File对象的最后修改时间戳,您确实会调用该lastModified()方法。您已经有一个文件的 ArrayList,因此遍历它以查找最后修改的字段应该是微不足道的。您还已经在循环文件列表,因此不需要再次循环并找到最后修改的文件。我还建议对您的代码进行一些其他优化:

List<File> fileNames = new ArrayList<File>(); // I would rather call this variable "files" though
long latestModified = -1;    
File lastModifiedFile = null;

// ...

for(File file : directory.listFiles()) {
    // Do your magic
    if(line.contains(queryUser)) {
        filesNames.add(file);
        if(file.lastModified() > latestModified) {
            lastModifiedFile = file;
            latestModified = file.lastModified();
        }
    }
}

// After the loop, the latest modified file will be held i the variable `lastModifiedFile`

我不确定它的目的是什么ArrayList,但也许你可以一起摆脱它。

于 2013-04-01T12:18:39.203 回答
0

我会这样做

    File lastModified = null;
    for (File file : directory.listFiles()) {
        if (file.isFile()) {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(new FileInputStream(file)));
            try {
                for (String line; (line = reader.readLine()) != null;) {
                    if (line.contains(queryUser)) {
                        arr.add(file);
                        if (lastModified == null
                                || file.lastModified() > lastModified
                                        .lastModified()) {
                            lastModified = file;
                        }
                    }
                }
            } finally {
                reader.close();
            }
        }
    }
于 2013-04-01T12:18:46.030 回答