![](/img/trans.png)
[英]How to read a portion of a text file to extract information to be used to create an object in Java
[英]How to read certain portion of the text file in java
我想讀取文本文件中的某些部分並將這些部分中的每一個添加到相應的 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 {
}
我想添加到我的 2 ArrayList 的部分在 source_files 和 clone_pairs 中用方括號“{}”括起來。 因此,例如我想在 arraylist 源文件中添加所有數據,例如
1 types.h 1
2 actions.c 2316
...etc
它們包含在 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 字符串。 對不起
為了大家的利益,這是 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");
}
}
您正在構建的內容稱為狀態機。 你需要一些東西來跟蹤你在文件中的位置 - 狀態。 我稱它為section
。
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();
}
我認為在while的主體中使用if / else的方法只是簡單的開銷。 因為對於您要檢查的每個循環:1。while循環中的條件2.循環中的每個if else。 然后當您遇到例如“source_files {”時,您仍在檢查所有這些條件的每個循環。
在任何情況下,您都必須讀取文件的每一行,如果您知道它們的定義順序,那么這應該更有效:
此方法將啟動BufferedReader。
private BufferedReader getBufferedReader(File file) {
try{
return new BufferedReader(new FileReader(file));
}
catch(FileNotFoundException e){
e.printStackTrace();
}
}
此方法將讀取緩沖區的每一行,直到遇到起始字符串。 然后它會將每個下一行添加到列表中,直到遇到右括號。 並將返回您新制作的清單。
private List<String> readContent(BufferedReader buff, String start) {
List<String> list = new ArrayList<String>();
try {
String readBuff;
do {
readBuff = buff.readLine();
}
while (readBuff != null && !readBuff.startsWith(start));
do {
readBuff = buff.readLine();
list.add(readBuff);
}
while (readBuff != null && !readBuff.startsWith("}"));
}
catch(IOException e){
e.printStackTrace();
}
return list;
}
最終你的方法看起來像這樣。
public void readLists(File file) {
BufferedReader buff = getBufferedReader(file);
List<String> sourceFiles = readContent(buff,"source_files {");
List<String> clonePairs = readContent(buff,"clone_pairs {");
}
這段代碼基本上直接在while循環中讀取文件的每一行一次,因此你不需要任何if / else。
如果您不知道文件中數據的順序,則只需要if / else。 因此,此代碼假定source_files首先出現,然后是clone_pairs。
另外,我使用startsWith,因為你的括號之后可能有一個空格,即“source_files {”會使等號失敗。
我試過這個
public static void readFile(String file){
List<String> sourceFiles = new ArrayList<String>();
List<String> clonePairs = new ArrayList<String>();
file = "test.txt";
try{
BufferedReader buff = Files.newBufferedReader(Paths.get(file));
try{
String readBuff = buff.readLine();
boolean sourceStart = false;
boolean cloneStart = false;
boolean sourceEnd = false;
while (readBuff != null){
if(readBuff.equals("}")){
sourceEnd = true;
sourceStart=false;
cloneStart=false;
}else {
sourceEnd = false;
}
if (sourceStart && !sourceEnd){
sourceFiles.add(readBuff);
}
else if (cloneStart && !sourceEnd){
clonePairs.add(readBuff);
}
if (readBuff.equals("source_files {")){
sourceStart=true;
}
if (readBuff.equals("clone_pairs {")){
cloneStart=true;
}
readBuff = buff.readLine();
}
sourceFiles.forEach(sf -> System.out.println(sf));
System.out.println("---------------------");
System.out.println("---------------------");
clonePairs.forEach(cf -> System.out.println(cf));
}
finally{
buff.close();
}
}
catch(FileNotFoundException e){
System.out.println("File not found exception");
}
catch(IOException e){
System.out.println(e);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.