찾다

 >  Q&A  >  본문

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 (  ) ;
        }
}
迷茫迷茫2807일 전1493

모든 응답(3)나는 대답할 것이다

  • ringa_lee

    ringa_lee2017-04-17 17:29:02

    간단히 말하면 필터를 목록에 추가할 때 필터에 정의된 조건을 사용하여 발생합니다

    회신하다
    0
  • 迷茫

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

    accept 메소드는 file.list 클래스의 소스 코드를 열면 호출 과정을 명확하게 볼 수 있습니다. 아래는 File 클래스에서 복사한 File 메소드입니다. list 으아아아

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-17 17:29:02

    콜백의 의미는 인터페이스(반드시 인터페이스일 필요는 없음)를 구현하지만 이 인터페이스를 호출하지 않고 이 인터페이스(Java 클래스 라이브러리를 참조해야 함)를 정의하는 당사자가 사용자가 제공한 구현을 호출하도록 한다는 것입니다. .

    요구 사항을 충족하는 하위 디렉터리를 나열하는 작업에는 여러 단계가 포함되며 그 중 일부는 변경되지 않습니다(예를 들어 먼저 현재 디렉터리의 모든 하위 디렉터리를 가져와야 합니다. 소스 코드는 본 적이 없지만 그래야 합니다. OS의 시스템 호출) 이는 Java 클래스 라이브러리에서 구현됩니다. 이 단계에 해당하는 것은 변경 작업, 즉 하위 디렉터리가 어떤 조건을 충족하기를 원하는지입니다. 따라서 클래스 라이브러리는 이 변경 부분을 사용자가 구현할 인터페이스로 설계한 다음 File.list()을 통해 콜백을 등록합니다.

    전화가 안 오니까 콜백이라고 부르죠. 전화하지 마세요. 제가 다시 전화할게요


    또는 보다 직접적으로 accept(File, String) 호출은 File.list(FilenameFilter) 함수 내에서 발생합니다. 함수 내에서 dirname 매개변수가 사용자가 제공한 구현에 전달됩니다. 즉, accept(File, String) 메서드가 호출됩니다.

    회신하다
    0
  • 취소회신하다