我想从脚本中获取信息,所以我使用了这个函数
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
答案 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;
}
感谢您的帮助!