我想读取文本文件中的某些部分,并将这些部分添加到相应的ArrayList中。这是一个示例文本文件:
format: pair_diploid
option: -b 50
option: -pp +
option: -mr masked
option: -n C:\Users\Fertilak\gimp\gimp
preprocess_script: cpp
source_files {
1 types.h 1
2 actions.c 2316
3 actions.h 1
4 editor-actions.c 91
5 editor-actions.h 1
287 test-clipboard.c 1247
}
source_file_remarks {
42
: masked
152
: masked
170
: masked
}
clone_pairs {
5545 56.0-180 148.0-180
3083 62.1959-2107 62.2107-2255
3083 62.2107-2255 62.1959-2107
89 82.0-520 82.620-1140
89 82.620-1140 82.0-520
5545 148.0-180 56.0-180
12084 2865.633-694 2868.2877-2938
12084 2868.2877-2938 2865.633-694
}
clone_set_remarks {
}
在source_files和clone_pairs中,我想添加到2个数组列表中的部分用括号"{}"括起来。
它们被括在source_files括号中,对于clone_pairs也是一样的,我会把括在括号中的所有数据添加到arraylist clonePairs中。
到目前为止,我就是这么做的......但是没有效果。
public void readFile(String file){
List<String> sourceFiles = new ArrayList<String>();
List<String> clonePairs = new ArrayList<String>();
try{
BufferedReader buff = new BufferedReader(new FileReader(file));
try{
String readBuff = buff.readLine();
while (readBuff != null){
if (readBuff.equals("source_files {") && !readBuff.equals("}")){
sourceFiles.add(readBuff);
}
else if (readBuff.equals("clone_pairs {") && !readBuff.equals("}")){
clonePairs.add(readBuff);
}
readBuff = buff.readLine();
}
}
finally{
buff.close();
}
}
catch(FileNotFoundException e){
System.out.println("File not found");
}
catch(IOException e){
System.out.println(e);
}
}
除了if-else条件之外,几乎所有的东西都在这段代码中工作。对于如何做到这一点,有什么建议吗?
编辑
我已经编辑了内容并替换为readBuff字符串。对不起
编辑2
为了每个人的利益,这是Andrew Solution Code提出的正确代码:
public void readFile(String file){
try{
BufferedReader buff = new BufferedReader(new FileReader(file));
try{
String readBuff = buff.readLine();
String section = "";
while (readBuff != null){
if (section.equals("source_files {") && !readBuff.equals("}")){
sourceFiles.add(readBuff);
} else if (section.equals("clone_pairs {") && !readBuff.equals("}")){
clonePairs.add(readBuff);
} else if (readBuff.equals("source_files {") || readBuff.equals("clone_pairs {")) {
section = readBuff;
} else if (readBuff.equals("}")) {
section = "";
}
readBuff = buff.readLine();
}
}
finally{
buff.close();
}
}
catch(FileNotFoundException e){
System.out.println("File not found");
}
catch(IOException e){
System.out.println("exceptional case");
}
}
3条答案
按热度按时间i2byvkas1#
你正在构建的东西叫做状态机,你需要一些东西来跟踪你在文件中的位置--状态,我称之为
section
。6yt4nkrj2#
我认为在while的主体中使用if/else的方法只是简单的开销,因为对于每个循环,你都要检查:1. while循环中的条件2.循环中的每个if else。然后当你遇到例如“source_files {”时,你仍然在检查每个循环中的所有那些条件。
在任何情况下,你都必须读取文件的每一行,如果你知道它们被定义的顺序,那么这应该会更有效:
此方法将获取BufferedReader作为开始。
这个方法将读取缓冲区的每一行,直到遇到起始字符串为止。然后,它将把下一行添加到列表中,直到遇到右括号为止。然后,它将返回新创建的列表。
最终你的方法看起来像这样。
这段代码基本上读取了文件的每一行,条件直接在while循环中,所以不需要任何if/else。
如果你不知道文件中数据的顺序,你只需要if/else,所以这段代码假设source_files在前,clone_pairs在后。
另外,我使用startsWith是因为在括号“source_files {“后面可能有一个空格,这将使等于失败。
ivqmmu1c3#
我试过这个
}