4

我有以下代码使用 Guava 的 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 ")。

实现这一目标的最优雅的方法是什么?

4

3 回答 3

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;}
  });
于 2012-06-13T14:52:46.973 回答
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!

它输出真。

于 2012-06-13T14:54:00.383 回答
2

使用trim()删除前导和尾随空格的方法。

boolean contains = false;

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

if(contains) {
    // do something
}

如果您还想要不区分大小写,那么您也可以使用toLowerCase().

于 2012-06-13T14:32:01.920 回答