cari

Rumah  >  Soal Jawab  >  teks badan

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 hari yang lalu1482

membalas semua(3)saya akan balas

  • ringa_lee

    ringa_lee2017-04-17 17:29:02

    Ringkasnya, ia berlaku menggunakan syarat yang ditentukan dalam penapis anda apabila anda menambahkannya pada senarai

    balas
    0
  • 迷茫

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

    Kaedah

    accept dipanggil dalam file.list Anda boleh membuka kod sumber kelas File dan melihat dengan jelas proses panggilan Di bawah ialah kaedah File yang saya salin daripada kelas 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()]);
        }
    

    balas
    0
  • ringa_lee

    ringa_lee2017-04-17 17:29:02

    Maksud panggil balik ialah anda melaksanakan antara muka (tidak semestinya antara muka), tetapi jangan panggil antara muka ini, tetapi biarkan pihak yang mentakrifkan antara muka ini (ini harus merujuk kepada perpustakaan kelas Java) memanggil pelaksanaan yang anda berikan .

    Pengendalian penyenaraian subdirektori yang memenuhi keperluan melibatkan beberapa langkah, beberapa daripadanya tidak berubah (contohnya, anda perlu mendapatkan semua subdirektori dalam direktori semasa dahulu. Saya tidak melihat kod sumber, tetapi ia sepatutnya panggilan sistem OS). Ini dilaksanakan dalam perpustakaan kelas Java. Sepadan dengan langkah ini ialah operasi perubahan, iaitu, apakah syarat yang anda mahu subdirektori itu dipenuhi. Oleh itu, pustaka kelas mereka bentuk bahagian perubahan ini sebagai antara muka untuk anda laksanakan, dan kemudian anda mendaftarkan panggilan balik anda melalui File.list().

    Kerana anda tidak menelefon, itulah sebabnya ia dipanggil panggilan balik - jangan hubungi saya, saya akan menghubungi semula


    Atau lebih langsung, panggilan accept(File, String) berlaku dalam fungsi File.list(FilenameFilter). Dalam fungsi tersebut, parameter dir dan name akan diserahkan kepada pelaksanaan yang anda berikan, iaitu kaedah accept(File, String) akan dipanggil.

    balas
    0
  • Batalbalas