问题
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