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

Java 从.txt文件中获取特定文本,java,bufferedreader,fileinputstream,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 FileIn

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

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);
                }
            }
        }
问题是,当一行以空格开头时,程序认为文件已结束! 那么,我如何修复它,并使程序pars到文件的末尾呢? 考虑到这条线可以从一个以上的空间开始
thx

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

while ((strLine = br.readLine().trim()) != null) {...}
编辑:不要这样做(谢谢乔普·艾根!),否则你会有一个很好的NPE。尝试:


首先:省去DataInputStream,这是一种更特定于Java对象的技术

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

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

我觉得你应该使用正则表达式(例如,使用该方法)。它们还可以提取字符串或子字符串(请参阅:)

还有Lars Vogella关于Java的精彩介绍。甲骨文也就这一主题编写了一份报告

可能这段代码有点帮助(使用):

正则表达式可能类似(注意:没有检查它-尤其是反斜杠):


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

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;
}
公共静态HashMap getEnvVariables(字符串脚本文件、字符串配置1、字符串配置2){
HashMap vars=新的HashMap();
BufferedReader br=null;
试一试{
FileInputStream fstream=新的FileInputStream(脚本文件);
br=新的BufferedReader(新的InputStreamReader(fstream));
字符串strLine=null;
字符串stopvar=config2;
字符串startvar=config1;
String关键字=“set”;
做{
if(strLine!=null&&strLine.contains(startvar)){
if(strLine.contains(stopvar)){
返回变量;
}
while(strLine!=null&&!strLine.contains(stopvar)){
strLine=br.readLine();
if(strLine.trim().startsWith(关键字)&&!strLine.contains($)){
strLine=strLine.trim().substring(关键字.length())
.trim();
String[]split=strLine.split(“”);
字符串名称=拆分[0];
字符串值=拆分[1];
System.out.println(名称+“=”+值);
变量put(名称、值);
}
}
}
}而((strLine=br.readLine())!=null);
}捕获(例外e){
状态状态=新状态(Status.ERROR,Activator.PLUGIN\u ID,
IStatus.ERROR,e.getMessage(),e);
Activator.getDefault().getLog().log(状态);
}
返回变量;
}

谢谢你的帮助

好主意,人们经常忘记简单的
.trim()
。尽管在
{…}
中执行,因为您仍然没有测试strLine是否为null。它仅在行仅以一个空格开头时有效:@Rad1“有效”是什么意思?它也适用于多个空间。这就是
trim()
的作用。根据本文,trim适用于多个字符,而不仅仅适用于空格字符@RAD1可能是有效的,这取决于实现。@ Zhedar,我的意思是当缓冲区正在读取文件时,如果修剪线以一个空间开头,它会读取它,当超过一个空间时,它认为文件已经结束并退出!
boolean started = false;
while ...
    if (!started) {
        started = strLine.matches("\\s*...\\s*");
    } else {
        ...
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";
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;
}