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

时间:2012-08-31 16:05:50

标签: java bufferedreader

我想读取文本文件中的某些部分,并将每个部分添加到相应的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 sourcefiles中添加所有数据,例如

    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字符串。遗憾

编辑2

为了每个人的利益,这是Andrew提出的正确代码 解决方案代码:

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

我认为在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 {”会使等号失败。