我在工作中得到了 config.txt ,如下所示:
#test
@Email1
Vorname;Vorname:
Nachname;Nachname:
Anrede;Anrede:
Titel;Titel:
Firma;Firma:
Abteilung;Abteilung:
EMail;E-Mail:
Strasse;Strasse:
PLZ;PLZ:
Ort;Ort:
Land;Land:
Telefon;Telefon:
Fax;Fax:
Bemerkung;Bemerkung:
Stichwort1;Stichwort1:
@Email2
#Format: sqlSpaltenname;EmailFeldName
Suchfeld2;Suchfeld2:
Firma;FIRMA1:
Abteilung;ABTEILUNG:
Anrede;ANREDE:
Nachname;NAME:
Vorname;VORNAME:
Strasse;STRASSE:
PLZ;PLZ:
Ort;ORT:
Land;LAND:
Telefon;TELEFON:
EMail;EMAIL:
Stichwort1;STICHWORT1:
Stichwort2;STIcHWORT2:
使用以下代码读取文件时:
public Config createConfig(String filename){
config = new Config();
String contentType = "";
String[] temp;
File fileDir = new File(filename);
int counter = 0;
specialConfigs = new ArrayList<String>(Arrays.asList("Betreff", "Sender", "Type", "Startbalken", "Endbalken"));
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileDir), "UTF8"));
String line;
while ((line = reader.readLine()) != null) {
counter++;
if(line.startsWith("#")){//auskommentiert
continue;
}
if(line.trim().length()==0){//leer
continue;
}
if(line.startsWith("@")){//Abschnittswechsel, @Email1, @Email2, @Einstellungen
contentType = line;
continue;
}
temp = line.split(";");
if(temp.length != 2){
if(specialConfigs.contains(temp[0]) && contentType.equals("@Email_Eigenschaften")){
parseSpecialContent(line);
} else {
Main.logger.warning("Fehler in der Konfigurationsdatei in Zeile: "+counter+"\nProgramm wird abgebrochen");
reader.close();
System.exit(0);
}
} else {
if(contentType.equals("@Email1")){
config.addEmailField(1, temp[0], temp[1]);
} else if(contentType.equals("@Email2")){
config.addEmailField(2, temp[0], temp[1]);
} else {
config.setParameter(temp[0], temp[1]);
}
}
}
reader.close();
} catch (FileNotFoundException e) {
Main.logger.severe("Fehler beim Einlesen der Konfigurationsdatei: "+filename+" Datei nicht gefunden."+"\nProgramm wird abgebrochen");
e.printStackTrace();
System.exit(0);
} catch (IOException e) {
Main.logger.severe("Fehler beim Einlesen der Konfigurationsdatei: "+filename+" Datei kann nicht gelesen werden."+"\nProgramm wird abgebrochen");
e.printStackTrace();
System.exit(0);
}
return config;
}
我总是遇到错误,因为第一行 #test 在读取时总是在内存中:&#34; #测试&#34;它获得了领先的空白。我尝试删除第一行再次重写整个文件。但无论我改变了什么,它总是以&#34; #测试&#34 ;.在处于调试模式时,我手动将变量行的值更改为正确的值 #test ,一切都运行良好。该程序早先运行良好。文件刚修改为包含值电子邮件,而不是早期版本电子邮件。早期版本仍然有效...任何人都可以帮忙吗?
答案 0 :(得分:1)
它可能是UTF-8 BOM (文件标记开头),\uFEFF
,零宽度空间,用作检测某些Unicode格式的标记:UTF-8, UTF-16LE,UTF-16BE等。
它是冗余的(不需要),但允许Windows记事本区分本地编码和UTF-8。也许该文件是用记事本制作的,并保存为Unicode(带BOM)。
解决方案是
while ((line = reader.readLine()) != null) {
line = line.replaceFirst("^\uFEFF", "");
这有点太多了,假设只涉及第一行。
答案 1 :(得分:0)
String#trim()
仅删除所有等于或小于空格字符(\u0020
)的字符,但还有更多字符是&#34;空格&#34;。
不使用trim()
,而是使用正则表达式删除字符串结尾处的所有 Graph (即不可打印的)字符:
line = line.replaceAll("^\\P{Graph}+|\\P{Graph}+$", "");