Query Mac OS X Spotlight from Java

邮差的信 提交于 2019-12-10 10:09:56

问题


Related to:

Query Windows Search from Java

But this time to use OSX's spotlight

I would like to consume OSX spotlight service from Java. Is there an API available?

.


回答1:


There is no Java API for Spotlight that I am aware of (I don't think it was added to the now deprecated Cocoa-Java bridge development on the bridge was stopped). There is a procedural C API for Spotlight, however, that you could wrap with JNI.




回答2:


I found some code that wraps the mdfind command line, works fine for me:

import java.io.*;
import java.util.*;


/**
 * This class performs filesystem searches using the Spotlight facility in Mac OS X
 * versions 10.4 and higher.  The search query is specified using the syntax of the
 * mdfind command line tool.  This is a powerful syntax which supports wildcards,
 * boolean expressions, and specifications of particular metadata attributes to search.
 * For details, see the documentation for mdfind.
 *
 * @author Peter Eastman
 */


public class Spotlight
{
  /**
   * Perform a Spotlight search.
   *
   * @param query      the query string to search for
   * @return a list of all files and folders matching the search
   */


  public static List<File> find(String query) throws IOException
  {
    return doSearch(new String[] {"mdfind", query});
  }


  /**
   * Perform a Spotlight search.
   *
   * @param query      the query string to search for
   * @param folder     the search will be restricted to files inside this folder
   * @return a list of all files and folders matching the search
   */


  public static List<File> find(String query, File folder) throws IOException
  {
    return doSearch(new String[] {"mdfind", "-onlyin", folder.getAbsolutePath(), query});
  }


  private static List<File> doSearch(String command[]) throws IOException
  {
    Process process = Runtime.getRuntime().exec(command);
    BufferedReader out = new BufferedReader(new InputStreamReader(process.getInputStream()));
    ArrayList<File> results = new ArrayList<File>();
    String line;
    while ((line = out.readLine()) != null)
      results.add(new File(line));
    return results;
  }


  /**
   * Get a map containing all searchable metadata attributes for a particular
   * file or folder.
   *
   * @param file     the file to report on
   * @return a Map containing all metadata for the file
   */


  public static Map<String,String> getMetadata(File file) throws IOException
  {
    Process process = Runtime.getRuntime().exec(new String[] {"mdls", file.getAbsolutePath()});
    BufferedReader out = new BufferedReader(new InputStreamReader(process.getInputStream()));
    HashMap<String,String> results = new HashMap<String,String>();
    String line;
    while ((line = out.readLine()) != null)
    {
      int equals = line.indexOf('=');
      if (equals > -1)
      {
        String key = line.substring(0, equals).trim();
        String value = line.substring(equals+1).trim();
        results.put(key, value);
      }
    }
    return results;
  }
}


来源:https://stackoverflow.com/questions/821969/query-mac-os-x-spotlight-from-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!