recherche

Maison  >  Questions et réponses  >  le corps du texte

java - FilenameFilter接口中,accept 方法回调问题

  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 (  ) ;
        }
}
迷茫迷茫2803 Il y a quelques jours1481

répondre à tous(3)je répondrai

  • ringa_lee

    ringa_lee2017-04-17 17:29:02

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

    répondre
    0
  • 迷茫

    迷茫2017-04-17 17:29:02

    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()]);
        }
    

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-17 17:29:02

    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.

    répondre
    0
  • Annulerrépondre