在txt文件中查找特定文本并将其存储在String中

时间:2016-05-15 21:58:54

标签: java

首先,我想说我是开始,这是我的第一个Java程序。我想创建一个程序来读取文本文件,找到特定的行,并将其保存到我的字符串变量中。

所以我想找到以" Dealt to"开头的行,然后在那行中复制所有内容,直到这个字符为' ['并把它放在我的字符串变量中。

所以,让我们说我的文本文件中有这一行: 处理我的NickName [文字] 我想要一个能找到文字"我的昵称"并把它放在我的字符串变量中。

我尝试使用类并尝试使用setter和getter进行练习,请让我知道我的代码是什么样的,以及如何改进它并让它工作。

这是Main.java:

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException{
        HandHistory hh1 = new HandHistory();
        String hero1 = null;

        hero1 = hh1.getHero();
        System.out.println(hero1);

    }
}

My HandHistory.java:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class HandHistory {

    private String hero; 

    public HandHistory(){}

    public String getHero() throws IOException {
        FileReader in = new FileReader("G:/Java/workspace/HandHistory/src/File.txt");
        BufferedReader br = new BufferedReader(in);

        String line;
        while ((line = br.readLine()) != null) {
            if (line.contains("Dealt to ")){
                hero = line.substring(9,(line.indexOf("["))-1);

            }
        }                   
        return hero;
    }

    public void setHero(String hero){
        this.hero = hero;
    }
}

2 个答案:

答案 0 :(得分:2)

这是一个好的开始,逐行读取文件的好方法。值得修复的一个问题是使用try-finally块关闭FileReader资源,或者从Java 7开始使用try-with-resources块:

try (FileReader in = new FileReader("G:/Java/workspace/HandHistory/src/File.txt")) {
  ...
}

我能想到的其他提示和评论:

  • 如果你真的不需要,你不必在班上设置一个二传手
  • 如果有行包含字符串“Dealt to”但不以该字符串开头,则代码不起作用。例如。 “Foobar Dealt to My NickName [text]”仍将匹配,但会返回错误的值
  • 如果你真的只想匹配以“Dealt to”开头的行,那么使用String.startsWith()而不是String.contains()
  • 当字符串中没有“[”时,您应该处理这种情况,否则您的代码会因难以理解的错误而崩溃
  • 如果正则表达式可以消除代码的复杂性,那么它们非常有用。在你的情况下,问题可以通过相对容易地使用startsWith和indexOf来解决,所以在这种情况下我不会使用RegExps
  • 在不查看实际代码的情况下,HandHistory.getHero()的作用并不明显。即使你自己为表达类或方法实际所做事情的事物分配名称,它总是非常有用。
  • 可以说getHero()方法做了太多事情,HandHistory类也做了太多事情,但是当使用代码比学习hello-world示例更大的东西时,这可能需要考虑。

答案 1 :(得分:1)

我的建议是使用正则表达式。您可以尝试使用

(?<=beginningstringname)(.*\n?)(?=endstringname)

所以,对于你的问题,这将是

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    public static void main( String args[] ){

      // String to be scanned to find the pattern.
      String line = "Dealt to My NickName [text]";
      String pattern = "(?<=Dealt to )(.*\n?)(?=[)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);

      //m now haves what you desire. You can loop it if you want.
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      } else {
         System.out.println("NO MATCH");
      }
   }
}

尝试使用本教程在Java http://www.tutorialspoint.com/java/java_regular_expressions.htm

中使用正则表达式