2012-06-13 92 views
4

我有下面的代碼,它利用番石榴的Files.readLines()方法:番石榴,Files.readLines()和空白

List<String> strings = Lists.newArrayList(); 
final File file = new File(filePath); 
if (file.isFile()) { 
    try { 
    strings= Files.readLines(file, Charsets.UTF_8); 
    } 
    catch (IOException ioe) {} 
} 
else { 
    // File does not exist 
} 

一旦我有我的字符串列表,我想測試一下看看如果我正在查看的當前字符串在文件中。

String myString = "foo"; 
if (strings.contains(myString)) { 
    // Do something 
} 

不過,我想使代碼寬容的原始文件在開頭或結尾空格(即" foo ")。

達到此目的最優雅的方法是什麼?

+0

寬容如何?這些行是任意的還是單個單詞?聽起來更像你想要使用正則表達式或更寬鬆的謂詞,而不是簡單的「包含」。確切的原因,番石榴具有功能風格的應用。 –

+0

他們是單個單詞。 – mip

回答

6

唯一的替代tskuzzy的,我能想到的是如下的方法:

List<String> trimmedLines = Files.readLines(file, Charsets.UTF_8, 
    new LineProcessor<List<String>>() { 
    List<String> result = Lists.newArrayList(); 

    public boolean processLine(String line) { 
     result.add(line.trim()); 
    } 
    public List<String> getResult() {return result;} 
    }); 
+0

這是我想到的。謝謝。 – mip

+0

'processLine(String line)'必須返回一個布爾值?我可以只添加'return true'嗎? – mip

+0

是的,只需返回'true'。 –

2

使用trim()方法,該方法刪除前導空白和尾隨空白。

boolean contains = false; 

for(String s : strings) { 
    if(s.trim().equals(myString)) { 
     contains = true; 
     break; 
    } 
} 

if(contains) { 
    // do something 
} 

如果您還希望區分大小寫,那麼您也可以使用toLowerCase()

+0

謝謝。我認爲可能有一種方法可以避免像這樣的字符串循環。雖然我猜這是什麼包含()無論如何? – mip

3

您不必遍歷整個文件(如果你想知道只有當行是文件),使用Files.readLines(File file, Charset charset, LineProcessor<T> callback)

public final class Test { 

    /** 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(final String[] args) throws IOException { 
    test1("test"); 
    } 

    static void test1(final String lineToTest) throws IOException { 

    final Boolean contains = Files.readLines(new File("test.txt"), Charsets.UTF_8, new LineProcessor<Boolean>() { 
     Boolean containsGivenLine = false; 

     @Override 
     public Boolean getResult() { 
     return containsGivenLine; 
     } 

     @Override 
     public boolean processLine(final String line) throws IOException { 
     if (line.trim().equals(lineToTest)) { 
      containsGivenLine = true; 
      return false; 
     } else { 
      return true; 
     } 
     } 
    }); 

    System.out.println("contains '" + lineToTest + "'? " + contains); 
    } 

給定的文件:

test 
me 
    if 
you want! 

它輸出正確的。

+0

我喜歡這個方法,但我更喜歡有一個修剪過的字符串列表,這樣我可以重複使用。 – mip

+0

然後@路易斯沃瑟曼的答案是你需要的;) – Xaerxess