如何在java中读取文本文件的某一部分

ocebsuys  于 2023-01-04  发布在  Java
关注(0)|答案(3)|浏览(146)

我想读取文本文件中的某些部分,并将这些部分添加到相应的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");
        }
    }
i2byvkas

i2byvkas1#

你正在构建的东西叫做状态机,你需要一些东西来跟踪你在文件中的位置--状态,我称之为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();
                }
6yt4nkrj

6yt4nkrj2#

我认为在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 {“后面可能有一个空格,这将使等于失败。

ivqmmu1c

ivqmmu1c3#

我试过这个

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);
   }

}

相关问题