代码之家  ›  专栏  ›  技术社区  ›  Sasha

读取逗号分隔的配置文件的最佳方法是什么?

  •  4
  • Sasha  · 技术社区  · 15 年前

    我有一个逗号分隔的配置文件。空行被忽略,无效行上需要有错误:

    酒吧

    氧化钡

    我想把这个文件读到 HashMap 其中键(foo)与值(bar)映射。

    最好的方法是什么?

    4 回复  |  直到 13 年前
        1
  •  6
  •   TofuBeer    15 年前

    如果可以使用x=y而不是x、y,那么可以使用properties类。

    如果你确实需要x,y,那么看看 java.util.Scanner 可以将分隔符设置为用作分隔符(JavaDoc显示了这样做的示例)。

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Scanner;
    
    class Main
    {
        public static void main(final String[] argv)
        {
            final File file;
    
            file = new File(argv[0]);
    
            try
            {
                final Scanner scanner;
    
                scanner = new Scanner(file);
    
                while(scanner.hasNextLine())
                {
                    if(scanner.hasNext(".*,"))
                    {
                        String key;
                        final String value;
    
                        key = scanner.next(".*,").trim();
    
                        if(!(scanner.hasNext()))
                        {
                            // pick a better exception to throw
                            throw new Error("Missing value for key: " + key);
                        }
    
                        key   = key.substring(0, key.length() - 1);
                        value = scanner.next();
    
                        System.out.println("key = " + key + " value = " + value);
                    }
                }
            }
            catch(final FileNotFoundException ex)
            {
                ex.printStackTrace();
            }
        }
    }
    

    和属性版本(对于解析来说更简单,因为没有)

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.Reader;
    import java.util.Properties;
    
    class Main
    {
        public static void main(final String[] argv)
        {
            Reader reader;
    
            reader = null;
    
            try
            {
                final Properties properties;
    
                reader = new BufferedReader(
                                new FileReader(argv[0]));
                properties = new Properties();
                properties.load(reader);
                System.out.println(properties);
            }
            catch(final IOException ex)
            {
                ex.printStackTrace();
            }
            finally
            {
                if(reader != null)
                {
                    try
                    {
                        reader.close();
                    }
                    catch(final IOException ex)
                    {
                        ex.printStackTrace();
                    }
                }
            }
        }
    }
    
        2
  •  5
  •   Jonathan Holloway    15 年前

    最好使用java.util.scanner类读取配置文件中的值,使用逗号作为分隔符。链接到JavaDoc:

    http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html

    例如:

    Scanner sc = new Scanner(new File("thing.config"));
    sc.useDelimiter(",");
    while (sc.hasNext()) {
       String token = sc.next();
    }
    
        3
  •  0
  •   Nick    15 年前

    我个人用的是一个叫斯蒂芬·奥斯特米勒的人的罐子,这是他的 Labeled CSV 语法分析器。这是一些示例代码。

    LabeledCSVParser lcsvp = new LabeledCSVParser(
        new CSVParser(
            new StringReader(
                "Name,Phone\n" +
                "Stewart,212-555-3233\n" +
                "Cindy,212-555-8492\n"
            )
        )
    );
    
    while(lcsvp.getLine() != null){
        System.out.println(
            "Name: " + lcsvp.getValueByLabel("Name")
        );
        System.out.println(
            "Phone: " + lcsvp.getValueByLabel("Phone")
        );
    }
    
        4
  •  0
  •   Community skywinder    13 年前
    try {
      BufferedReader cfgFile = new BufferedReader(new FileReader(new File("config.file")));
      String line = null;
    
      // Read the file line by line
      while ((line = cfgFile.readLine()) != null) {
        line.trim();
        // Ignore empty lines
        if (!rec.equals("")) {
           String [] fields = line.split(","); 
           String key = fields[0];
           String value = fields[1];  
           // TODO: Check for more than 2 fields
           // TODO: Add key, value pair to Hashmap  
        } // if
      } // while
    
      cfgFile.close();
    } catch (IOException e) {
      System.out.println("Unexpected File IO Error");
    }