Java 在txt文件中查找特定文本并以字符串形式存储

Java 在txt文件中查找特定文本并以字符串形式存储,java,Java,首先我想说我是beginer,这是我的第一个Java程序。我想制作一个程序来读取文本文件,找到特定的行,并将其保存到我的字符串变量中 所以我想找到以“处理对象”开头的行,然后在该行中,复制之后的所有内容,直到这个字符“[”并将其放入我的字符串变量中 假设我的文本文件中有一行: 处理我的昵称[文本] 我想有一个程序,将找到文本“我的昵称”,并把它放在我的字符串变量 我尝试使用类,尝试使用setter和getter只是为了练习,请让我知道我的代码是什么样子,以及我如何改进它并使其工作 这是Main.

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

所以我想找到以“处理对象”开头的行,然后在该行中,复制之后的所有内容,直到这个字符“[”并将其放入我的字符串变量中

假设我的文本文件中有一行: 处理我的昵称[文本] 我想有一个程序,将找到文本“我的昵称”,并把它放在我的字符串变量

我尝试使用类,尝试使用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;
    }
}

我的建议是使用正则表达式。你可以用

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

(?这是一个很好的开始,是逐行读取文件的好方法。值得解决的一个问题是使用try finally块关闭FileReader资源,或者因为Java 7使用了新的try with resources块:

try (FileReader in = new FileReader("G:/Java/workspace/HandHistory/src/File.txt")) {
  ...
}
我能想到的其他提示和评论:

  • 如果你实际上不需要,你不需要在你的课堂上有一个setter
  • 如果有行包含字符串“处理对象”,但不以该字符串开头,则代码将不起作用。例如,“Foobar处理对象我的昵称[文本]”仍将匹配,但将返回错误的值
  • 如果确实只想匹配以“处理对象”开头的行,请使用String.startsWith()而不是String.contains()
  • 当字符串中没有“[”时,您应该处理这种情况,否则代码会因难以理解的错误而崩溃
  • 如果正则表达式消除了代码的复杂性,那么它很有用。在您的例子中,使用startsWith和indexOf可以相对容易地解决这个问题,所以在这种情况下我不使用RegExps
  • 如果不看实际的代码,HandHistory.getHero()的作用并不明显。为表示类或方法实际作用的内容指定名称对您来说总是非常有用的
  • 可以说GeToReo()方法做的事情太多,类的手历史也是如此,但是在使用代码做一些比学习Hello World的例子更大的事情时,这可能需要考虑。
很好的建议。我想补充一点,如果
HandHistory
的构造函数不起任何作用,可以忽略它。Java将采用默认的无参数构造函数。您好jhncz,感谢您的帮助,您所说的一切都很有意义,将更改代码的某些部分。您好Leonel,感谢链接将阅读它!为什么使用Reg更好例如,是更快还是其他原因?通常是因为更快。另一种方法是循环遍历文本中的每个字符,试图找到起始字符串和结束字符串……这是效率低下且难以编码的(我的意见)。
try (FileReader in = new FileReader("G:/Java/workspace/HandHistory/src/File.txt")) {
  ...
}