Самый эффективный способ прочитать все файлы в списке в Android - PullRequest
2 голосов
/ 07 февраля 2011

Моему Android-приложению необходимо найти каталог камеры по умолчанию и получить имена файлов JPEG, созданных за определенный промежуток времени.В настоящее время я делаю это с помощью приведенного ниже фрагмента кода.Идея состоит в том, чтобы отфильтровать файлы не только по расширению jpg, но и использовать тот факт, что в именах файлов есть дата / время.

Я запускаю приведенную ниже функцию getImages () в потокесам интерфейс не затрагивается.Я заметил, что если в каталоге много файлов, даже после всего этого, требуется некоторое время.Есть ли более быстрый алгоритм или специальные функции Android, которые я могу использовать для дальнейшей его оптимизации?


private boolean getImages()
    {
        boolean status=true;
        File dir = new File(picPath);
        //Optimize file search by setting the common file prefix as a filter
        //get the date format used by camera to store files.
        String startStr=startTime.format3339(false);
        String endStr=endTime.format3339(false);
        //Loop through each character of start time 
        //and compare with end time till a mismatch is found
        int len=startStr.length();
        int idx=0;
        for ( idx=0;id < len;idx++ )
        {       
            if (startStr.charAt(idx) != endStr.charAt(idx))
            {
                Log.d(TAG,"breaking at idx "+ idx);
                break;
            }
        }
        filterString=endStr.substring(0,idx).replace("T", " ").replace(":",".");
        Log.d(TAG,"Filter String" + filterString);

        String[] children = dir.list(new JpegFilter());
        List matchedFiles = new ArrayList();
        Log.d(TAG,dir.getAbsolutePath()+" has "+ children.length+ " files");
        int numfiles = children.length;
        for(int i=0;i < numfiles;i++)
        {
            //Get file modify time
            File file = new File(picPath+File.separator+children[i]);
            // Get the last modification information.
            long lastModified = file.lastModified();
            if (lastModified > =startTime.toMillis(false)) //If file modified date greater than equals start time
            {
                Log.d(TAG,"Match! " + children[i]);
                if (lastModified < =endTime.toMillis(false))//If file modified date less than equals end time
                {
                    matchedFiles.add(picPath+File.separator+children[i]);
                }
                else //We are now over the time range, quit loop to save time 
                {
                    break; //TODO break out of for loop
                }
            }
        }
        if (!matchedFiles.isEmpty()) //If there are images to be processed
        {
            status=convertToPDF(matchedFiles,pdfFile);
            Log.d(TAG,"convertToPDF() returned " + status); 
        }

        return status;
    }

Это класс фильтров, который я использую


class JpegFilter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return (name.startsWith(captureJPEG.filterString) && name.endsWith(".jpg"));
    }
}

Ответы [ 2 ]

1 голос
/ 07 февраля 2011

См. http://androidworkz.com/2010/07/08/source-code-find-files-by-type-play-media-file/

public class FileUtils {

public File[] listFilesAsArray(File directory, FilenameFilter[] filter,
        int recurse) {
    Collection<File> files = listFiles(directory, filter, recurse);

    File[] arr = new File[files.size()];
    return files.toArray(arr);
}

public Collection<File> listFiles(File directory,
        FilenameFilter[] filter, int recurse) {

    Vector<File> files = new Vector<File>();

    File[] entries = directory.listFiles();

    if (entries != null) {
        for (File entry : entries) {
            for (FilenameFilter filefilter : filter) {
                if (filter == null
                        || filefilter
                                .accept(directory, entry.getName())) {
                    files.add(entry);
                    Log.v("FileUtils", "Added: "
                            + entry.getName());
                }
            }
            if ((recurse <= -1) || (recurse > 0 && entry.isDirectory())) {
                recurse--;
                files.addAll(listFiles(entry, filter, recurse));
                recurse++;
            }
        }
    }
    return files;
}

}

0 голосов
/ 07 февраля 2011

Вы взглянули на пример браузера файлов Android, написанный здесь ? Может быть, вы можете использовать этот пример и настроить его для ваших конкретных потребностей. Я не уверен, что это быстрее, но это хорошая отправная точка, чтобы рассмотреть альтернативный подход к вашей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...