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