白色空间作为第一个字符读取文件java

时间:2018-04-03 12:40:27

标签: java io

我在工作中得到了 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 ,一切都运行良好。该程序早先运行良好。文件刚修改为包含值电子邮件,而不是早期版本电子邮件。早期版本仍然有效...任何人都可以帮忙吗?

2 个答案:

答案 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}+$", "");