如何提高在Java中搜索特定Google Drive文件的效率?

时间:2017-09-20 09:06:08

标签: java algorithm google-drive-api

我开发了一个Java程序来搜索Google Drive上特定文件夹中的特定文件。它使用DFS(深度优先搜索)算法进行搜索。

然而,搜索效率非常差。如果文件位于“更晚”或更深的文件夹中,则程序将在几分钟内找到,如果找到,或者有时会超时并响应HTTP 500内部服务器错误。

该计划如下:

public static void main(String[] args) throws IOException {
    DriveSearch driveSearch = new DriveSearch();
    String searchResult = driveSearch.fetchData("F1b1ZuRUpPLWh6",
            "test.txt");
    System.out.println(searchResult);
}

public String fetchData(String folderID, String searchFileName) {
    String result = "";

               ~~~~~  Skip Codes for Authorization  ~~~~
    // try {
    //     try {
    Drive service = new Drive.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();
    long startTime = System.currentTimeMillis(); // Begin search time
    //         String pageToken = null;
    //         do {
    System.out.println("=== Begin Search ===");
    File searchResult = recursiveSearch(folderID, searchFileName);
    System.out.println("=== End Search ===");
    long endTime = System.currentTimeMillis(); // End search time
    long totTime = (endTime - startTime) / 1000;
    System.out.println("This search takes " + totTime + " seconds to find the file.");
    if (searchResult != null) {
        result = searchResult.getName();
    }
    //             pageToken = fileList.getNextPageToken();
    //         } while (pageToken != null);
    //     } catch (IOException e) {
    //         result = "invalid_grant";
    //         System.err.println(e.getMessage());
    //     }
    // } catch (Throwable t) {
    //     t.printStackTrace();
    // }
    return result;
}

public File recursiveSearch(String folderID, String searchFileName) throws IOException {
    File searchResult = null;
    FileList fileList = service.files().list().setQ("'" + folderID + "' in parents and trashed = false")
        // .setSpaces("drive")
        .setCorpora("user").setFields("nextPageToken, files(id, name, mimeType)").execute();
    List<File> items = fileList.getFiles();

    for (File file : items) {
        if (file.getName().equals(searchFileName)) {
            searchResult = file;
            System.out.println(file.getName() + " is found!");
            return searchResult;
        } else if (file.getMimeType().equals("application/vnd.google-apps.folder")) {
            System.out.println("Recursive Search");
            System.out.println("file.getId() is " + file.getId());
            searchResult = recursiveSearch(file.getId(), searchFileName);
        } else {
            System.out.println("file name is " + file.getName());
        }
    }
    return searchResult;
}

由于特定文件可以立即在Google云端硬盘搜索栏中找到,是否也可以立即在特定文件夹中找到?如果是,我该怎么做才能提高搜索效率?谢谢你的任何建议。

1 个答案:

答案 0 :(得分:4)

昂贵的部分是在每次递归调用中调用Google云端硬盘。它们不是必需的。您可以在一次通话中获取所有文件的列表:

@Html.HiddenForCollection(m => m.MyList)

然后搜索文件的文件列表。当然,您可以像在代码中一样添加过滤器,例如:过滤掉已删除的文件。