【问题标题】:how to search for a filename in a list of files如何在文件列表中搜索文件名
【发布时间】:2017-03-22 04:06:25
【问题描述】:

我需要从文件名列表中找到一个文件名,并根据找到的结果启动两个方法。我试过了:

FileList result = service.files().list()
             .setPageSize(10)
             .setFields("nextPageToken, files(id, name)")
             .execute();
        List<File> files = result.getFiles();
        if (files == null || files.size() == 0) {
            System.out.println("No files found.");
        } else {
            System.out.println("Files:");
            for (File file : files) {
                System.out.printf("%s (%s)\n", file.getName(), file.getId());
                Boolean found = files.contains("XYZ");
                if(found)
                {
                    insertIntoFolder();
                } else {
                    createFolder();
                }
            }
        }

我需要从文件名列表(如sjh, jsdhf, XYZ, ASDF)中找到XYZ(文件名)。一旦我找到它,我需要停止搜索。如果名称与名称列表不匹配,我只需在检查该列表中的所有名称后创建一个文件夹。

【问题讨论】:

    标签: java list file


    【解决方案1】:
    Boolean found = files.contains("XYZ");
    

    这条线有问题。 filesFile 对象的列表,其中没有一个与 String "XYX" 匹配。 List.contains() 本质上是在列表的每个元素上调用Object.equals(),而File.equals("XYZ") 将始终返回false

    如果你在像 Eclipse 这样的 IDE 中编程,它应该在这一行显示一个警告,因为它是一个可以在编译时检测到的错误。

    要确定List&lt;File&gt; 中的File 是否具有与给定字符串匹配的文件名,您需要对文件名本身进行操作,因此上述行应改为:

    boolean found = file.getName().equals("XYZ");
    

    根据您想要匹配的具体内容,您可能想要使用.getName().getAbsolutePath().toString()


    使用 Java 7 中引入的 Path API 也是一个好主意,而不是 File,此时它本质上是一个遗留类。

    如果您想要一个比手动循环查找匹配文件更优雅的解决方案,您可以使用Files.newDirectoryStream(Path, Filter),它允许您定义仅匹配某些文件的Filter 谓词,例如

    Files.newDirectoryStream(myDirectory, p -> p.getFileName().toString().equals("XYZ"))
    

    File.list(FilenameFilter) 与处理File 对象的功能类似,但同样,如果可能,更喜欢使用Path API。

    【讨论】:

      【解决方案2】:

      这是一个例子:

      /**
      * return true if file is in filesList else return false
      */
      static boolean isFileInList(File file, List<File> filesList) {
          for(File f: filesList) {
              if (f.equals(file)) {
                  return true;
              }
          }
          return false;
      }
      public static void main(String[] args) {
          List<File> files;// the filelist; make sure assign these two variable.
          File file; // the file you want to test.
          if (isFileInList(file, files)) {
              //file is presented
          } else {
              //file is not presented
              createFolder();
          }
      }
      

      【讨论】:

      • 非常感谢
      【解决方案3】:
      package test;
      
      import java.io.File;
      import java.io.FilenameFilter;
      import java.io.IOException;
      
      public class DirectoryContents {
      
      public static void main(String[] args) throws IOException {
      
          File f = new File("."); // current directory
      
          FilenameFilter textFilter = new FilenameFilter() {
              public boolean accept(File dir, String name) {
                  String lowercaseName = name.toLowerCase();
                  if (lowercaseName.endsWith(".txt")) {
                      return true;
                  } else {
                      return false;
                  }
              }
          };
      
          File[] files = f.listFiles(textFilter);
          for (File file : files) {
              if (file.isDirectory()) {
                  System.out.print("directory:");
              } else {
                  System.out.print("     file:");
              }
              System.out.println(file.getCanonicalPath());
          }
      
      }
      
      }
      

      【讨论】:

      • 这是如何回答这个问题的?您没有提供任何解释或指导,并且此代码本质上与 OP 所询问的内容无关。 "我需要从文件名列表(如 sjh、jsdhf、XYZ、ASDF)中找到 XYZ (fileName)。一旦找到,我需要停止搜索。解释如何使用FilenameFilter 是一个合理的答案,但这只是一段代码。
      • 感谢您的回答
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 2018-03-05
      • 2018-06-26
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      相关资源
      最近更新 更多