从.txt文件中获取特定文本

时间:2013-07-17 11:24:47

标签: java bufferedreader fileinputstream

我想从脚本中获取信息,所以我使用了这个函数

public static HashMap<String, String> getEnvVariables(String scriptFile,String config) {
    HashMap<String, String> vars = new HashMap<String, String>();
    try {

        FileInputStream fstream = new FileInputStream(scriptFile);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        String strLine;
                          String var= "if [ \"$1\" = \""+config +"\" ] ; then";
        // Read File Line By Line
        while ((strLine = br.readLine()) != null) {
            // use a Scanner to parse the content of each line
            // exclude concatenated variables (export xx:$xx)
            if (strLine.startsWith("export") && !strLine.contains("$")) {
                strLine = strLine.substring(7);
                Scanner scanner = new Scanner(strLine);
                scanner.useDelimiter("=");
                if (scanner.hasNext()) {
                    String name = scanner.next();
                    String value = scanner.next();
                    System.out.println(name+"="+value);
                    vars.put(name, value);
                }
            }
        }

但是我想从特定的

行开始阅读
if [ \"$1\" = \""+config +"\" ] ; then

问题是,当一行以空格开头时,程序认为该文件已经结束! 那我怎么能修复它并使程序解析到文件的末尾? 考虑到这条线可以从更多的空间开始 thx

4 个答案:

答案 0 :(得分:2)

您可以尝试从每一行修剪不相关的空格吗?

while ((strLine = br.readLine().trim()) != null) {...}

编辑:不要那样做(感谢Joop Eggen!)或者你会有一个不错的NPE ......)。尝试:

while ((strLine = br.readLine()) != null) {
    strLine = strLine.trim();
    ...
}

答案 1 :(得分:1)

听起来像你应该使用正则表达式(例如使用String.matches()方法)。它们也可以提取字符串或子串(参见:another Stackoverflow article)。

Lars Vogella对Java中的regular expressions也有一个很好的介绍。 Oracle还针对该主题编译了Tutorial/Lesson

这段代码可能会有所帮助(使用org.apache.commons.io.LineIterator):

public void grepLine(File file, String regex)
{
    LineIterator it = FileUtils.lineIterator(file, "UTF-8");
    try
    {
        while (it.hasNext())
        {
            String line = it.nextLine();
            if(line.matches(regex))
            {
                    //...do your stuff
            }
        }
    }
    finally
    {
        LineIterator.closeQuietly(it);
    }
}

正则表达式可能是这样的(注意:没有检查过它 - 特别是反斜杠):

String regex="^\\s*if\\s+\\[\\s+\\\"\\$1\\\" = \\\""+config +"\\\" \\] ; then";

答案 2 :(得分:0)

首先:省略DataInputStream,更多Java Object特定。

boolean started = false;
while ...
    if (!started) {
        started = strLine.matches("\\s*...\\s*");
    } else {
        ...

Reg ex \\s*代表零个或多个空格字符(制表符,空格)。

答案 3 :(得分:0)

我找到了一个与你分享的解决方案。

public static HashMap<String, String> getEnvVariables(String scriptFile ,String config1,String config2) {
    HashMap<String, String> vars = new HashMap<String, String>();
    BufferedReader br = null;
    try {
        FileInputStream fstream = new FileInputStream(scriptFile);
        br = new BufferedReader(new InputStreamReader(fstream));
        String strLine = null;
        String stopvar = config2;
        String startvar =config1;
        String keyword = "set";
        do {
            if (strLine != null && strLine.contains(startvar)) {
                if (strLine.contains(stopvar)) {
                    return vars;
                }
                while (strLine != null && !strLine.contains(stopvar)) {
                    strLine = br.readLine();
                    if (strLine.trim().startsWith(keyword)&& !strLine.contains("$")) {
                        strLine = strLine.trim().substring(keyword.length())
                        .trim();
                        String[] split = strLine.split("=");
                        String name = split[0];
                        String value = split[1];
                        System.out.println(name + "=" + value);
                        vars.put(name, value);
                    }
                }
            }
        } while ((strLine = br.readLine()) != null);
    } catch (Exception e) {
        Status status = new Status(Status.ERROR, Activator.PLUGIN_ID,
                IStatus.ERROR, e.getMessage(), e);
        Activator.getDefault().getLog().log(status);
    }
    return vars;
}

感谢您的帮助!