java - FilenameFilter接口中,accept 方法回调问题
迷茫
迷茫 2017-04-17 17:27:02
0
3
1495
  1. 见下面的程序,这个回调是怎么发生的啊?从程序中怎么看不出逻辑,都没有调用accept ()?

import java . io . File ;
import java . io . * ;
import java . util . * ;
import java . util . regex . * ;


public class DirList
{
        public static void main (String [ ] args)
        {
                File path = new File (".") ; 
                String[ ] list ;
                if ( args . length == 0 )
                {
                        list = path . list ( ) ;
                }
                else 
                {
                        list = path . list (new DirFilter ( args [ 0 ])) ; 
                }
                Arrays . sort (list , String . CASE_INSENSITIVE_ORDER );
                for (String dirItem : list ) 
                    System . out . println (dirItem) ;        
        }
}

class DirFilter implements FilenameFilter 
{
        private Pattern pattern ; 
        public DirFilter ( String regex )
        {
                pattern = pattern . compile ( regex );
        }
        
        public boolean accept ( File dir , String name )
        {
                return pattern . matcher ( name ) . matches (  ) ;
        }
}
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

répondre à tous(3)
左手右手慢动作

Pour faire simple, cela se produit en utilisant les conditions définies dans votre filtre lorsque vous l'ajoutez à la liste

迷茫

La méthode

accept est appelée dans file.list Vous pouvez ouvrir le code source de la classe File et voir clairement le processus d'appel. Vous trouverez ci-dessous la méthode File que j'ai copiée à partir de la classe list.

    public String[] list(FilenameFilter filter) {
        String names[] = list();
        if ((names == null) || (filter == null)) {
            return names;
        }
        List<String> v = new ArrayList<>();
        for (int i = 0 ; i < names.length ; i++) {
            if (filter.accept(this, names[i])) {
                v.add(names[i]);
            }
        }
        return v.toArray(new String[v.size()]);
    }
左手右手慢动作

La signification du rappel est que vous implémentez une interface (pas nécessairement une interface), mais n'appelez pas cette interface, mais laissez la partie qui définit cette interface (cela devrait faire référence à la bibliothèque de classes Java) appeler l'implémentation que vous avez donnée .

L'opération de listage des sous-répertoires qui répondent aux exigences implique plusieurs étapes, dont certaines restent inchangées (par exemple, vous devez d'abord récupérer tous les sous-répertoires du répertoire courant. Je n'ai pas vu le code source, mais il devrait l'être un appel système du système d'exploitation). Ceux-ci sont implémentés dans les bibliothèques de classes Java. À cette étape correspond l’opération de changement, c’est-à-dire quelles conditions souhaitez-vous que le sous-répertoire remplisse. Par conséquent, la bibliothèque de classes conçoit cette partie du changement comme une interface que vous pouvez implémenter, puis vous enregistrez votre rappel via File.list().

Parce que vous n'appelez pas, c'est pourquoi cela s'appelle un rappel - ne m'appelez pas, je vous rappellerai


Ou plus directement, l'appel de accept(File, String) se produit au sein de la fonction File.list(FilenameFilter). Au sein de la fonction, les paramètres dir et name seront transmis à l'implémentation que vous avez donnée, c'est-à-dire que la méthode accept(File, String) sera appelée.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal