Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Apache FileFilterUtils排除特定文件? 请考虑以下文件夹结构: src |_text1.txt |_text2.txt |_content |_text1.txt |_text2.txt_Java_Apache_File_Filter_Copy - Fatal编程技术网

Java 如何使用Apache FileFilterUtils排除特定文件? 请考虑以下文件夹结构: src |_text1.txt |_text2.txt |_content |_text1.txt |_text2.txt

Java 如何使用Apache FileFilterUtils排除特定文件? 请考虑以下文件夹结构: src |_text1.txt |_text2.txt |_content |_text1.txt |_text2.txt,java,apache,file,filter,copy,Java,Apache,File,Filter,Copy,如何设计org.apache.commons.io.filefilter.IOFileFilter以排除src/text1.txt和src/text2.txt,但保留src/content/text1.txt和src/content/text2.txt 当前我的筛选器如下所示: IOFileFilter filter = FileFilterUtils.and( FileFilterUtils.notFileFilter(FileFilterUtils.n

如何设计org.apache.commons.io.filefilter.IOFileFilter以排除src/text1.txt和src/text2.txt,但保留src/content/text1.txt和src/content/text2.txt

当前我的筛选器如下所示:

IOFileFilter filter = FileFilterUtils.and(
                    FileFilterUtils.notFileFilter(FileFilterUtils.nameFileFilter("text1.txt", IOCase.SENSITIVE)),
                    FileFilterUtils.notFileFilter(FileFilterUtils.nameFileFilter("text2.txt", IOCase.SENSITIVE))
            );
FileUtils.copyDirectory(new File("src"), new File("dst"), filter);
但是上面的代码片段显然也没有复制src/content/文件夹中的两个文本文件(我想复制它们)。。。顺便说一句,文本文件的名称是不可更改的


有什么想法吗?

AFAIK commons io不提供类似于
路径文件过滤器的东西,因此您必须在此处添加自己的过滤器

NameFileFilter
,顾名思义,只检查文件名,即路径不相关

提供自己的过滤器不应该那么难。我建议在这里对
AbstractFileFilter
NameFileFilter
进行子类化。子类化
NameFileFilter
可能被认为是一种有点脏的方法,因为您不仅要检查名称,而且只需要覆盖
accept()
方法:

public boolean accept(File file) {
   return accept( file.getPath() );
}

public boolean accept(File dir, String name) {
  //use normalize to account for possible double separators or windows paths which use \
  return accept( FilenameUtils.normalize( dir.getPath() + "/" + name ) );
}

protected boolean accept( String path ) {     
   for (String nameSuffix: names) {
     if (caseSensitivity.checkEndsWith( path, nameSuffix )) {
         return true;
     }
   }
   return false;
}
然后您可以像使用
FileFilterUtils.notFileFilter(新的PathFileFilter(“/text1.txt”))
等一样使用它

或者,您可以提供一组模式并检查这些模式:

private Set<Pattern> pathPatterns = new HashSet<>();

PathFileFilter(String... patterns) {
   for( String p : patterns ) {
     pathPatterns.add( Pattern.compile(p) );
   }
}

protected boolean accept( String path ) {     
  for (Pattern pattern : pathPatterns) {
    //separatorsToUnix is used to convert \ to /
    if ( pattern.matches( FilenameUtils.separatorsToUnix( path ) )) {
      return true;
    }
  }
  return false;
}
private Set pathPatterns=new HashSet();
PathFileFilter(字符串…模式){
for(字符串p:模式){
pathPatterns.add(Pattern.compile(p));
}
}
受保护的布尔接受(字符串路径){
用于(模式:pathPatterns){
//分隔符tounix用于将\转换为/
if(pattern.matches(FilenameUtils.separatorsToUnix(path))){
返回true;
}
}
返回false;
}
用法:
newpathfilefilter((?i)(.*/)?test[12]\\.txt”)
新的PathFileFilter((?i)(.*/)?test1\\\.txt“,(?i)(.*/)?另一个Test2\\.txt”)

正则表达式的简短分类:

  • (?i)
    使表达式不区分大小写,保留它以进行区分大小写的匹配
  • (.*/)?
    表示如果文件名前面有任何字符,则必须以斜杠结尾,即,这将匹配
    some/path/test1.txt
    ,但不匹配
    someothertest1.txt
  • test[12]\\.txt
    将是文件名,这里的意思是
    text
    ,后跟
    1
    2
    ,最后是
    .txt