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