2017-08-02 80 views
1

我正在每分钟在一个线程中验证目录中的许多文件。 目前我正在使用下面的功能,工作正常。 我的问题是我是否可以重写这个方法来加快运行速度(java8?),希望能够缩短。文件名验证

public boolean validateFile(String fileName) { 
    fileName = fileName.substring(0, fileName.lastIndexOf('.')); 
    String[] values = fileName.split("_"); 
    if (values.length == 4) { 
     if(!values[1].matches("0*")) { 
      if(!fileName.contains(" ")) { 
       if(values[3].equals("PASS") || values[3].equals("FAIL")) { 
        return true; 
       } 
      } 
     } 
    } 
    return false; 
} 

规则验证:

  1. 文件名不能包含任何空白字符。
  2. 文件名拆分器始终为_字符。
  3. 值[1]不能只包含零()。它必须有12位数字。
  4. 值[3]必须包含“PASS”或“FAIL”。
  5. 数组值[]长度必须总是4

可以运行和叉上http://ideone.com/dh8j9M

+1

由于您的代码正常工作,并且您只是在寻找一种改进方法,所以我认为这个问题在https://codereview.stackexchange.com/上属于更好。 –

+2

正则表达式? – SHG

+1

我投票结束这个问题作为题外话,因为它属于[codereview.se]。 – shmosel

回答

5

像这样此代码与文件名的例子 - 只是分支的一个普通的变换以Java的8。可能更具可读性,但不会更快。

return Optional.ofNullable("test") // your fileName 
      .filter(x -> !x.contains(" ")) 
      .map(x -> x.substring(0, x.lastIndexOf("."))) 
      .map(x -> x.split("_")) 
      .filter(arr -> arr.length == 4) 
      .filter(arr -> !arr[1].matches("0*")) 
      .filter(arr -> arr[3].equals("PASS") || arr[3].equals("FAIL")) 
      .isPresent(); 
+1

似乎像一个可选会更合适。 – shmosel

+0

@shmosel吧......谢谢。编辑 – Eugene

2

即使@Eugene的回答是更表现,但我认为你也可以打破整个regex成片,使之清楚。例如:

private static final String PREFIX = "\\w+"; 
private static final String DIGIT12 = "(?:[1-9]\\d{11}|0\\d{11})"; 
private static final String TIMESTAMP = "[1-9]\\d{11}"; 
private static final String STATUS = "(?:PASS|FAIL)"; 
private static final String EXTENSION = "\\p{Alpha}+"; 

private static final String FILENAME_REGEX = 
     format("%s_%s_%s_%s\\.%s", PREFIX, DIGIT12, TIMESTAMP, STATUS, EXTENSION); 

private boolean validateFile(String fileName) { 
    return fileName.matches(FILENAME_REGEX); 
} 
+0

应该的String.format,不格式(“%S ... http://ideone.com/1GLwiv – nanomader94

+1

@ nanomader94是啊,我用静态的进口替代,:) –

+0

BTW,我选择的第一个答案becaues这其中一个不能为我的文件名例子开箱即用,我没有时间去纠正它。不过,谢谢。 – nanomader94